所以我正在设置一个具有更新属性的模型。
然后在我看来,我正在监听这个模型的更改事件。
当它触发时,我认为我应该使用 model.changedAttributes?我是否将其传递给回调?
它应该返回所有更新的属性的哈希,还是新的?无论如何都知道哪些是更新的,哪些是新的?
一旦我有了这个更改属性的哈希值,我应该如何进行更新?将对象解析为属性类型,还是我应该从一开始就使用更高分辨率的侦听器?
谢谢!
所以我正在设置一个具有更新属性的模型。
然后在我看来,我正在监听这个模型的更改事件。
当它触发时,我认为我应该使用 model.changedAttributes?我是否将其传递给回调?
它应该返回所有更新的属性的哈希,还是新的?无论如何都知道哪些是更新的,哪些是新的?
一旦我有了这个更改属性的哈希值,我应该如何进行更新?将对象解析为属性类型,还是我应该从一开始就使用更高分辨率的侦听器?
谢谢!
如果您的视图仅显示单个属性 - 例如,如果它是显示模型的某些布尔属性的复选框 - 您应该听该属性的“更改:属性名称”事件,如Backbone 文档中所述。
如果您的视图更复杂并且依赖于多个模型属性 - 例如,如果它是具有“done”、“text”和“dueDate”元素的“To Do”列表项的视图,则监听“change”事件. 在这种情况下,您可以选择更新每个事件的所有元素,也可以使用 changedAttributes() 来确定哪些元素需要更新。
为了显示 ...
这种风格适用于正在渲染的模型属性数量小于 3 左右的简单视图。不仅如此,代码变得有点麻烦。
model.bind('change:done', function() {
view.doneElement.checked = model.get('done');
});
model.bind('change:text', function() {
view.textElement.value = model.get('text');
});
model.bind('change:dueDate', function() {
view.dueDateElement.value = model.get('dueDate');
});
这种风格适用于呈现 4 个或更多属性的复杂视图(3/4 属性计数只是一个粗略的指导,主要基于我的个人意见)。
model.bind('change', function() {
view.doneElement.checked = model.get('done');
view.textElement.value = model.get('text');
view.dueDateElement.value = model.get('dueDate');
});
这样做的缺点是,对于任何更改,视图的每个元素都会更新。因此,例如,如果一个人将待办事项标记为“完成”,则文本将被重新渲染,可能会丢失他们在那里可能拥有的任何选择。有时这种事情是一个问题,有时不是 - 你必须根据你的观点到底在做什么来决定。
这是上述更细微的变化,并结合了两种方法的优点。它根据 changedAttributes() 结果更新需要更新的视图元素。
model.bind('change', function() {
var diff = model.changedAttributes();
for (var att in diff) {
switch(att) {
case 'done':
view.doneElement.checked = model.get('done');
break;
case 'text':
view.textElement.value = model.get('text');
break;
case 'dueDate':
view.dueDateElement.value = model.get('dueDate');
break;
}
}
});
最后,我会注意到还有另一种变体,它涉及让视图存储它正在显示的值的散列,并将其传递给 changedAttributes() 方法。这通常不是必需的,所以我不会在这里详细介绍您。
根据主干文档,更改事件将模型和模型的集合传递给事件处理程序。
该事件在更改发生后触发,因此传递的模型包含更改。
“更改”事件不允许您知道哪些属性已更改或添加。如果您需要根据单个属性进行操作,请使用“change:attribute”事件。