正确触发骨干模型变更事件的方法

时间:2014-07-26 00:15:07

标签: javascript backbone.js

我正在尝试创建简单的Backbone示例,但我不明白我的代码有什么问题。为什么有2个testAttr属性(直接在对象上,在属性对象中有一个)以及为什么不更改任何触发任何更改?另外,我不明白在模型上设置属性的正确方法是什么?

继承我的代码:

<div id="note"></div>
<script>
var NoteModel = Backbone.Model.extend({
    defaults: function() {
        return {
            testAttr: "Default testAttr"
        }
    }
});

var NoteView = Backbone.View.extend({
    initialize : function() {
        this.listenTo(this.model, "change", this.changed());
    },
    el: "#note",
    changed: function () {
        debugger;
        console.log("change triggered");
        this.render();
    },
    render : function() {
        this.$el.html("<h1>" + this.model.get("testAttr") + "</h1>");
        return this;
    }
});

var note = new NoteModel();

var noteView = new NoteView({model: note});
noteView.render();

note.set("testAttr", "blah1");
note.testAttr = "blah2";
</script>

1 个答案:

答案 0 :(得分:1)

更改此行:

this.listenTo(this.model, "change", this.changed());

到此:

this.listenTo(this.model, "change", this.changed);

对于问题的第二部分,使用.set()进行一组脏检查以查看您是否更改,删除或未更改任何内容,然后触发相应的事件。它没有设置object.property值,而是设置object.attributes.property值(由backbone.js跟踪)。如果您直接更改了对象属性,则无法为您启动该事件。

...除非您使用令人惊讶和有品位 Object.observe() !!! 1! - ITS ALIVE (in Chrome >36)