Магистральный Фасад / Посредник Pattern Challenge
Я играю с аурой (http://github.com/addyosmani/backbone-aura ) Пример реализации фасада и медиатора паттернов в магистрали.JS. Я надеюсь, что кто-то знаком с этой концепцией.. Я пытаюсь прочитать переменные (например, i в этом примере в разделе renderComplete фасада. как я могу (если это вообще возможно) получить доступ к функциям/переменным Appview?
Консоль.журнал (это.i); возвращает неопределенное, поэтому я предполагаю я где-то потерял сферу действия
define([
'jquery',
'underscore',
'backbone',
'text!templates/master.html',
'../aura/mediator',
'../aura/facade',
'../subscriptions'
], function($, _, Backbone, masterTemplate, Mediator, Facade){
var AppView = Backbone.View.extend({
el: "body",
i : 5,
template: _.template(masterTemplate),
facade: {
routeChange: Facade.extend("masterViewChange", "routeChanged", function(route){
console.log("Change view to " + this.i);
}),
renderComplete: Facade.extend("postMasterRender", "masterRendered", function(){
console.log(this.i);
})
},
events: {},
initialize: function() {
this.render();
Mediator.publish("masterRendered", this);
},
render: function() {
$(this.el).html(this.template());
}
});
return AppView;
});
2 ответа:
Когда вы публикуете уведомление "masterrended", вы передаете ссылку на текущее представление в качестве второго параметра (this). Этот второй параметр передается функции обратного вызова, определенной в renderComplete. Поэтому вам нужно написать что-то вроде этого:
function (obj) { console.log(obj.i); }
Вместо:
function () { console.log(this.i); }
С уважением
Вам нужно привязать методы фасада к контексту представления, выполнив что-то вроде этого в инициализаторе представления:
initialize: function() { _.bindAll(this, "facade.routeChange", "facade.renderComplete"); }
Хотя я сомневаюсь, что _.bindAll может обрабатывать этот случай, когда функция, которую вы хотите связать, является свойством другого объекта.