【问题标题】:Trigger backbone.js change when value doesn't change当值没有改变时触发backbone.js改变
【发布时间】:2013-04-11 22:07:53
【问题描述】:

backbone.js 的一个已知特性是,当您设置未更改的数据时,它不会触发更改事件,也不会通过验证。但是,我需要触发 change 事件,因为我正在存储来自 AJAX 调用的 JSON 响应,该调用存储后端验证的结果。如果用户在同一字段留空的情况下继续提交表单,则后端验证将返回相同的 JSON 结果,当我将其保存到模型时,它不会触发更改事件。

我在将数据设置到模型中的 AJAX 成功回调中尝试了一些事情:

尝试的解决方案 #1

t.model.unset('fieldErrors',{silent: true});
t.model.set({fieldErrors: JSONResponse});

尝试的解决方案 #2

t.model.set({fieldErrors: null},{silent: true});
t.model.set({fieldErrors: JSONResponse});

当进行调用并且用户具有相同的 JSONResponse 时,这些都不会导致第二次触发更改事件。

【问题讨论】:

  • 如果您不怕样板,请参阅 ScottPuleo 的回答。否则,您可以覆盖 Model#set 方法以始终触发自定义事件(如果您有兴趣,我会发布答案)。

标签: backbone.js


【解决方案1】:

手动触发更改事件:

t.model.trigger('change', t.model);

t.model.trigger('change:fieldErrors', t.model, newFieldErrorsValue);

【讨论】:

  • 可能永远不应该使用第二种情况(随机选项)。 trigger 方法就是这里所需要的。请记住传递必要的参数,因为当您手动触发时,主干不会为您执行此操作。
  • 注意:“第二个案例”指的是一个已经被删除的旧案例。
  • @Scott Puleo 这是一个老问题,但我想知道您能否解释为什么我们需要将模型本身作为第二个参数传递给trigger?当我不这样做时,Collection._onModelEvent(稍后调用)不会收到模型。在我看来,model.trigger('change') 应该足以将模型转发到以后的事件。你知道为什么不是吗? (对不起,如果我的问题不清楚......)
  • 哦,好吧,在询问之前应该多搜索一下。看起来像一个错误:github.com/jashkenas/backbone/issues/3717
【解决方案2】:
this.model.set({fieldErrors: JSONResponse}, {silent:true});
this.model.trigger('change:fieldErrors');

看到这个对话:

Can I force an update to a model's attribute to register as a change even if it isn't?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多