Javascript - определение имени свойства объекта по ссылке - PullRequest
0 голосов
/ 05 августа 2011

Я пытаюсь установить некоторые свойства внутри объекта.Я бы не хотел говорить объекту, чего ожидать извне (делая объект более гибким, imo), поэтому я попытался без успеха:

Есть идеи?Ура!

обновление

    var data = {
        options : [
            {
                interval : 8000,
                target : '#slider img',
            },
        ],
        images : [
            {
                img : 'assets/img/assets/img/slider_test_img.png',
                title : 'Uniforme de Restauração 1',
                description : 'blablabla descricao',
                url : 'http://www.google.pt',
            },
            {
                img : 'assets/img/assets/img/slider_test_img.png',
                title : 'Uniforme de Restauração 2',
                description : 'blablabla descricao 2',
                url : 'http://www.google.pt',
            },
            {
                img : 'assets/img/assets/img/slider_test_img.png',
                title : 'Uniforme de Restauração 3',
                description : 'blablabla descricao 3',
                url : 'http://www.google.pt',
            },
        ],
    }

Ответы [ 3 ]

6 голосов
/ 05 августа 2011

Вы должны сохранить ссылку на this:

var self = this;
$.each(data, function(index, value) {
    self[index] = value;
});

или использовать метод jQuery jQuery.proxy:

$.each(data, $.proxy(function(index, value) {
    this[index] = value;
}, this));

В противном случае this будет ссылаться на value, как описано в документации .

2 голосов
/ 05 августа 2011

Либо создайте прямую ссылку на объект:

$.each(data,
    function(index, value) {
     //     v------direct reference
        slideshow[index] = value;
    }
);

, либо не используйте $.each(), а просто используйте цикл for-in для объекта или for для массива, поскольку это не изменит значение this:

  // I don't know if data is an Array or an object
for( var n in data ) {
    this[ n ] = data[ n ];
}

Или вы можете использовать jQuery.proxy() [документы] метод установки значения this в обработчике $.each().

$.each(data,
    $.proxy( function(index, value) {
        this[index] = value;
    }, this )
);
1 голос
/ 05 августа 2011

Проблема в том, что внутри функции, которую вы передаете each, this больше не ссылается на slideshow, а на value текущей итерации. вам нужно сохранить ссылку на слайд-шоу, прежде чем идти в каждый цикл:

slideshow = {
    init : function(data) {
        if (!data)
            return false;

        var that = this;

        $.each(data,
            function(index, value) {
                that[index] = value;
            }
        );
    },
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...