【问题标题】:Binding to property of model attribute in Backbone.js绑定到 Backbone.js 中模型属性的属性
【发布时间】:2014-07-07 21:06:00
【问题描述】:

免责声明:我是 Backbone.js 的新手(来自 AngularJS),所以我可能对它应该如何工作有一个不准确的心理模型。

我有一个对象,characterNodes,我正在我的模型上创建一个属性。 characterNodes 看起来像这样:

 var characterNodes = {
  character_1: {
      stories: [// list of Stories]
  },
  character_2: {
      stories: [// list of Stories]
  }
  ...
}

我的主干模型如下所示:

var StoryGraph = joint.dia.Graph.extend({

    initialize: function() {
        // Call parent constructor
        StoryGraph.__super__.initialize.apply(this, []);

        this.set('characterNodes', characterNodes);

        this.on('change:characterNodes', function() { 
            alert('test');
        });
    }
  });

每个故事都有一个属性“isUnlocked”,该属性在应用程序的其他地方进行了更改。每当更改此属性时,我想触发一个事件(即,应该弹出警报“测试”)。使用上面的代码,事件似乎永远不会触发。

我无法从 Backbone 文档中清楚地了解这是否应该工作 - 每当任何属性(或子属性或子子属性等)时都会触发 on('change:characterNodes') characterNodes 的变化?还是仅当指向对象的指针发生变化时,即当它被另一个对象替换时?还是我做错了什么?谢谢!

【问题讨论】:

    标签: backbone.js jointjs


    【解决方案1】:

    Backbone 没有任何魔力,基本上,change 事件仅在您将 "characterNodes" 设置为新对象时才会触发。如果您要更改该对象的嵌套属性,Backbone 不知道它发生了。您有三个选择:a) 更改整个对象(例如,通过创建副本),b) 每当您更改嵌套属性时手动触发 change 事件 (m.trigger("change:characterNodes")),c) 不要为此使用嵌套对象。将“character1_Stories”作为顶级属性。

    选项 c) 更可取。尽量保持模型中的属性平坦。选项 a) 也可以,但它的缺点是必须复制对象。不推荐选项 b)。这是因为 Backbone 会跟踪模型属性的先前值 (m.previous("characterNodes"))。如果您更改嵌套属性,则先前的值将与新值对同一对象具有相同的引用,因此,它不会反映其先前的状态。

    【讨论】:

      【解决方案2】:

      尝试调用函数而不是定义函数,并传递第三个参数以保持上下文调用。

      类似这样的:

       this.on('change:characterNodes', this.AlertSomething, this);
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 2010-11-26
        相关资源
        最近更新 更多