3

当我尝试通过模型上save的更改事件更新 Backbone 中的模型时,会触发两次。事件按此顺序触发。

  1. 改变
  2. 要求
  3. 改变
  4. 同步

但是,如果我通过,则只会触发(wait: true)第一个事件。change

任何人都可以解释为什么会发生这种情况,以及我如何才能change在不通过的情况下只开火一次(wait: true)

两个变化事件:

    editItem: function() {
        this.model.save({
            name: "Howard the Duck"
        });
    }

一个变化事件:

    editItem: function() {
        this.model.save({
            name: "Howard the Duck"
        }, (wait: true);
    }

伪代码:

App.Views.Item = Backbone.View.extend({
    initialize: function() {
        this.model.on("change", this.changing, this);
        this.model.on("request", this.requesting, this);
        this.model.on("sync", this.syncing, this);
    },

    events: {
        "click a": "editItem"
    },

    editItem: function() {
        this.model.save({
            name: "Howard the Duck"
        });
    }

    changing: function() {
        console.log("changing");
    },        

    requesting: function() {
        console.log("requesting");
    },

    syncing: function() {
        console.log("syncing");
    }
});
4

1 回答 1

7

以下是在更改属性时保存模型时发生的情况的分解:

  1. model.set将数据作为参数传递时,当为假时
    触发更改事件options.wait
  2. XHR 请求
  3. model.set当服务器返回的数据为真或服务器返回的数据不是模型知道的数据时
    触发更改事件options.wait

您的服务器可能会返回一个修改后的属性,该属性会触发第二个更改事件。修改您的响应或限制您的事件监听

this.model.on("change:name", this.changing, this);

比较这些小提琴

于 2013-01-08T09:33:16.190 回答