2012-06-18 2 views
2

Я создаю представления через $ .each, а атрибут myId всех представлений всегда заканчивается тем, что перезаписывается myId последнего элемента.Backbone.js переписывает переменные переменных

Создание просмотров

$('.form').each(function() { 
     // split class name 
     var classNameArray = $(this).attr('class').split('-'); 
     // get typeId from last part of classname 
     var myId = classNameArray[classNameArray.length-1]; 
     new myView({ 'el': $('.form-' + myId), 'myId': myId });  
    }); 

инициализация моего взгляд

var myView = Backbone.View.extend({ 
events: { 

}, 
initialize: function() { 
    var myId = this.options.myId; 

}, 
test: function() { 
    console.log(myId); // will return myId of last view created 
} 

}); 

Как я могу получить мнение, чтобы сохранить свои уникальный MyId лет?

ответ

0
test: function() { 
    console.log(myId); // will return myId of last view created 
} 

это [MyId] не [MyId] в:

initialize: function() { 
    var myId = this.options.myId;  
} 

это является [myId] от:

$('.form').each(function() { 
     // split class name 
     var classNameArray = $(this).attr('class').split('-'); 
     // get typeId from last part of classname 
     var myId = classNameArray[classNameArray.length-1]; //from this myId!!! 
     new myView({ 'el': $('.form-' + myId), 'myId': myId });  
}); 

потому что:

первый:

"var myId = this.options.myId; " 

это [MyId] является инициализации в локальных переменных, вы не можете получить доступ к этой переменной за пределами метода.

второй:

console.log(myId); // will return myId of last view created 

почему мы здесь быть в состоянии получить доступ к [MyId], потому что это [MyId] является [this.myId], [это] является контекст метода вызова:

new myView({ 'el': $('.form-' + myId), 'myId': myId }); 

так, то это [MyId] является:

var myId = classNameArray[classNameArray.length-1]; 

[MyId] here.this [MyId] циклическая смена, так что вы всегда получите последний цикл значение [myId].

решение:

initialize: function() { 
    this.myId = this.options.myId; 
}, 

, потому что [this.myId] является [MyView] 's внутренних переменных, каждый раз, когда вы создаете экземпляр [MyView], в методе [инициализации] динамически кнопок [ this.myId] установлен в правильную форму значения [this.options.myId].

рода проблемы, вы можете обратиться к этой статье:

http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain

2

Когда вы пишете, как это -

initialize: function() { 
    var myId = this.options.myId; 
}, 

Это создает переменную локальной для инициализации функции (это Java-вещь, а не Backbone вещь).

Попробуйте вместо этого (создание локальной переменной в Посмотреть объекта):

initialize: function() { 
    this.myId = this.options.myId; 
}, 
Смежные вопросы