2

我正在玩弄在 Backbone.js 中实现FacadeMediator模式的光环( http://github.com/addyosmani/backbone-aura)示例。我希望有人熟悉这个概念。我正在尝试读取变量(例如,在此示例中,我在外观的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;
});
4

2 回答 2

2

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

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

代替:

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

问候

于 2012-06-09T02:37:14.607 回答
0

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

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

尽管我质疑 _.bindAll 是否可以处理您要绑定的函数是另一个对象的属性的这种情况。

于 2013-01-04T20:35:15.157 回答