0

免责声明:我是 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 文档中清楚地了解这是否应该起作用 - 每当 characterNodes 的任何属性(或子属性或子子属性等)发生变化时都会触发 on('change:characterNodes') ? 还是仅当指向对象的指针发生变化时,即当它被另一个对象替换时?还是我做错了什么?谢谢!

4

2 回答 2

0

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

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

于 2014-07-08T07:29:23.660 回答
0

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

像这样的东西:

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

希望能帮助到你。

于 2014-07-07T22:51:37.953 回答