【问题标题】:Backbone Facade/Mediator Pattern ChallengeBackbone Facade/Mediator 模式挑战
【发布时间】:2012-04-20 21:35:14
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    代替:

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

    问候

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 2018-01-21
        • 1970-01-01
        相关资源
        最近更新 更多