2

如果您的值是简单的属性,那么主干模型.get().set()例程就可以了。我继承了一个应用程序,但是其中的值也是 JSON 对象。

model.get("key")返回

{start:
    {top:5, bottom:6}, 
    end:{...}
 }

等等。使用这些值中的任何一个设置.set()都是 PITA,因为您必须取出旧值,进行所需的更改,然后再次将其重新输入。即如果我想要bottom= 7,你不能只做.set("start.bottom",7). 我需要做类似的事情:

var tempValue = model.get("start");
tempValue.bottom = 7;
model.set("start",tempValue)

模型有一个 attributes 属性,您可以在其中执行model.attributes.start.bottom = 7. 现在这大概不会触发任何事件处理程序,因为查看 Backbone 代码,这是在set.

所以两个问题:

  • 如果我不需要更改处理程序来触发,直接设置属性有什么问题吗?
  • 无论如何在设置属性后手动触发更改处理程序?

Backbone 更改日志说- “模型#change 方法已被删除,因为延迟的属性更改不再可用” -但我不完全确定为什么会这样。听起来很有用。

与此相关:我也在尝试将 HTML 表单解析到模型中。我一直在尝试使用 ModelBinder,但它无法处理嵌套的 JSON。例如<input type="text" name="start.top">

编辑:我刚刚意识到你可以model.set({})用一个对象来做。例如model.set({start :{top:7}});,但它有点笨重

4

1 回答 1

2
  1. 如果我不需要更改处理程序来触发,直接设置属性有什么问题吗?

我认为这可能会回答您的问题: Backbone.js get and set nested object attribute

  1. 无论如何在设置属性后手动触发更改处理程序?

set方法(没有静默选项)触发 2 个事件:“change”和“change:attributeName”。

如果需要,可以通过调用手动触发它们:

model.trigger("change change:attributeName")
于 2013-03-13T13:32:55.633 回答