No se puede leer la propiedad 'url' de undefined. El widget de carga de jQuery falla

Estoy tratando de crear un widget en jQuery para manejar la carga de contenido en ciertos divs en una página. La razón por la que estoy haciendo esto es para mantener mi código SECO. Tal vez debería mencionar que uso HeadJS para cargar javascript.

Este es el código de mi widget:

(function ($, window, document, undefined) {

    $.widget ("my.contentloader", {

        options: {

            loadingMessage: true,

            errorDiv: '#error',

            contentDiv: '#content'

        },

        _create: function () {

            $.ajax ({

                type: "POST", 

                url: self.options.url, 

                data: {limit: self.options.params.limit, offset: self.options.params.offset},

                beforeSend: function (html) {

                    // Check if loading message should be displayed

                    if (self.options.loadingMessage) {

                        $(self.options.contentDiv).html ("<div id='loading'>Loading</div>");

                    }

                },

                success: function (html) {

                    if (self.options.loadingMessage) {

                        $('#loading').remove ();

                    }

                    $(self.options.contentDiv).html (html);

                },

                error: function (html) {

                    $(self.options.errorDiv).html (html);

                }

            });

        },

        _setOption: function (key, value) {

            this.options[key] = value;

            $.Widget.prototype._setOption.apply (this, arguments);

    }

    });

})(jQuery, window, document);

Incluyo este archivo de widget y jquery en la página de llamadas. Entonces uso el complemento así:

 $(window).contentloader ({

  url: 'loading/content/url'

 });

El problema es que me sale este error:

Uncaught TypeError: Cannot read property 'url' of undefined

preguntado el 22 de mayo de 12 a las 08:05

1 Respuestas

No estas definiendo self en cualquier lugar para que estés recibiendo window.self en cambio y eso es

una referencia de objeto al objeto ventana.

y eso no tiene un options propiedad. deberías estar usando this en lugar de self; si necesita forzar un determinado this en sus devoluciones de llamada, luego haga lo siguiente:

var _this = this; // or 'var that'

antes de definir las devoluciones de llamada y el uso _this (o that):

_create: function () {
    var _this = this;
    $.ajax ({
        // ...
        beforeSend: function (html) {
            if (_this.options.loadingMessage) {
                //...

La presencia de los window.self hace var self una mala elección de nombre.

Respondido 27 ago 13, 18:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.