Магистральный Фасад / Посредник 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 2

2 ответа:

Когда вы публикуете уведомление "masterrended", вы передаете ссылку на текущее представление в качестве второго параметра (this). Этот второй параметр передается функции обратного вызова, определенной в renderComplete. Поэтому вам нужно написать что-то вроде этого:

function (obj) { console.log(obj.i); }

Вместо:

function () { console.log(this.i); }

С уважением

Вам нужно привязать методы фасада к контексту представления, выполнив что-то вроде этого в инициализаторе представления:

initialize: function()
{
    _.bindAll(this, "facade.routeChange", "facade.renderComplete");
}

Хотя я сомневаюсь, что _.bindAll может обрабатывать этот случай, когда функция, которую вы хотите связать, является свойством другого объекта.