绑定到Backbone.js中模型属性的属性

时间:2014-07-07 21:06:00

标签: backbone.js jointjs

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

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

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

My Backbone Model看起来像这样:

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"在应用程序的其他地方更改。我希望在更改此属性时触发事件(即,即应弹出警报' test')。使用上面的代码,事件似乎永远不会触发。

我无法从Backbone文档中清楚地了解这是否应该有效 - 只要有任何属性(或子属性或子属性),就会触发('更改:characterNodes') -nub-property等)characterNodes的变化?或者只有当指向对象的指针发生变化时,即当它被另一个对象替换时?或者我做错了什么?谢谢!

2 个答案:

答案 0 :(得分:0)

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

这样的事情:

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

希望它有所帮助。

答案 1 :(得分:0)

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

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