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

绑定到Backbone.js中模型属性的属性,backbone.js,jointjs,Backbone.js,Jointjs,免责声明:我是来自AngularJS的Backbone.js新手,所以我可能对如何工作有一个不准确的心理模型 我有一个对象,characterNodes,我正在我的模型上创建一个属性。characterNodes看起来像这样: var characterNodes = { character_1: { stories: [// list of Stories] }, character_2: { stories: [// list of Stories]

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

我有一个对象,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');
        });
    }
  });
 this.on('change:characterNodes', this.AlertSomething, this);
我的主干模型如下所示:

 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');
        });
    }
  });
 this.on('change:characterNodes', this.AlertSomething, this);
每个故事都有一个属性isUnlocked,该属性在应用程序的其他地方更改。我想触发一个事件,即,无论何时更改此属性,都应弹出警报“test”。按照上面的代码,事件似乎永远不会触发


我无法从主干文档中清楚地了解这是否应该起作用-当characterNodes的任何属性或子属性或子子属性等发生更改时,是否会触发“change: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');
        });
    }
  });
 this.on('change:characterNodes', this.AlertSomething, this);

希望有帮助。

主干网没有任何魔力,基本上,只有将characterNodes设置为新对象时,才会触发更改事件。如果您正在更改该对象的嵌套属性,主干不知道发生了什么。您有三个选项:a更改整个对象(例如,通过创建副本),b手动触发更改事件m.triggerchange:characterNodes每当您更改嵌套属性时,c不为此使用嵌套对象。将character1\u故事作为顶级属性

备选方案c更可取。尽量使模型中的属性保持平坦。选项a也可以,但它的缺点是必须复制对象。不建议选择b。这是因为主干跟踪模型属性m.previouscharacterNodes的先前值。如果更改嵌套特性,则以前的值将与新值对同一对象具有相同的引用,因此,它不会反映其以前的状态