lr.MapView
- это «класс», все, что строит Backbone.View.extend
, будет в lr.MapView.prototype
, а не в lr.MapView
.Запустите это с открытой консолью, и вы увидите, что происходит:
var MapView = Backbone.View.extend({ foo: 'bar' });
console.log(MapView);
console.log(MapView.prototype);
console.log(MapView.prototype.foo);
Демо: http://jsfiddle.net/ambiguous/DnvR5/
Если у вас будет только один MapView, вы можете обратитьсяна lr.MapView.prototype.foo
везде:
initialize: function() {
_.bindAll(this, "render");
console.log(lr.MapView.prototype.foo);
}
Обратите внимание, что везде включает в себя lr.MapView
экземпляры, поэтому ваш foo
будет действовать как "переменная класса" в языках OO, не основанных на прототипах.
Правильный способ сделать это - использовать переменную экземпляра для foo
и передать экземпляр родительского представления экземплярам вложенного представления при их создании:
// In MapView
addOneEvent: function(e) {
var ev = new lr.EventView({
model: e,
parent: this
});
}
// In EventView
initialize: function(options) {
_.bindAll(this, "render");
this.parent = options.parent; // Or use this.options.parent everywhere.
console.log(this.parent.foo);
}
Или лучше добавить метод доступа к MapView
:
_foo: 'bar',
foo: function() { return this._foo }
и использовать этот метод в EventView
:
initialize: function(options) {
// ...
console.log(this.parent.foo());
}
Правильная инкапсуляция и интерфейсы - хорошая идея даже в JavaScript.