骨干立面/中介模式挑战

时间:2012-04-07 19:14:16

标签: javascript design-patterns backbone.js requirejs facade

我正在使用Backbone.js中实现 Facade Mediator 模式的光环(http://github.com/addyosmani/backbone-aura)示例。我希望有人熟悉这个概念。我正在尝试读取变量(例如,在本例中 i 在Facade的 renderComplete 部分。 我怎么能(如果可能的话)访问Appview的函数/变量?

console.log(this.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 个答案:

答案 0 :(得分:2)

当您发布'masterRendered'通知时,您正在将对当前视图的引用作为第二个参数传递(this)。第二个参数传递给您在renderComplete中定义的回调函数。所以你需要写这样的东西:

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

而不是:

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

此致

答案 1 :(得分:0)

您需要通过在View的初始化程序中执行以下操作,将Facade方法绑定到View上下文:

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

虽然我怀疑_.bindAll是否可以处理这种情况,你要绑定的函数是另一个对象的属性。