主干:模型保存上的两个更改事件

Backbone: Two Change Events on Model Save

本文关键字:两个 事件 模型 保存 主干      更新时间:2023-09-26

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

  1. 请求

然而,如果我通过(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");
    }
});

下面是在更改属性时保存模型的分解:

  1. model.set,数据作为参数传递
    options.wait为false时触发change事件
  2. XHR请求
  3. model.set与从服务器返回的数据
    options.wait为真或服务器返回的数据不是模型所知道的
  4. 时,触发change事件

您的服务器可能返回一个修改后的属性,从而触发第二个change事件。要么修改响应,要么用

限制事件监听
this.model.on("change:name", this.changing, this);

比较这些提琴

  • http://jsfiddle.net/nikoshr/ZWFWx/
    响应是客户端发送的
    您应该看到请求改变—— - 同步

  • http://jsfiddle.net/nikoshr/QT3YJ/
    模拟您的问题的版本,其中服务器添加了模型中不存在的值
    请求改变—— - 同步改变——