【发布时间】:2015-06-26 22:35:16
【问题描述】:
如何使用model.fetch() 更新视图,即当我获取模型时,视图不应被破坏或重新渲染。它应该通过重置以前的模型来更新新模型。
this.model.fetch({success: this.render.bind(this)});
这段代码正在重新渲染我的视图..我怎样才能用新模型更新视图
谢谢。
【问题讨论】:
标签: backbone.js model marionette fetch
如何使用model.fetch() 更新视图,即当我获取模型时,视图不应被破坏或重新渲染。它应该通过重置以前的模型来更新新模型。
this.model.fetch({success: this.render.bind(this)});
这段代码正在重新渲染我的视图..我怎样才能用新模型更新视图
谢谢。
【问题讨论】:
标签: backbone.js model marionette fetch
有多种方法可以根据您的需要更新视图。
如果视图相当简单,并且只需要在模型的 fetch 上自动更新视图,再次渲染视图是最简单的(可以使用模型上的 Backbone 同步事件,并且可以声明式处理模型事件使用 Marionette View 的 modelEvents 哈希 -http://marionettejs.com/docs/marionette.view.html#viewmodelevents-and-viewcollectionevents)
modelEvents: {'sync': 'render'}
如果您在复杂视图中更改的模型属性很少,您可以通过监听模型属性上的更改事件通过 jquery 直接更新 dom 元素:
modelEvents: {'change:name':'nameChanged'},
nameChanged: function(model, value){ this.$('#name').val(value);}
如果需要在视图和模型之间进行双向数据绑定,可以使用像 Backbone.stickit 这样的框架 - https://github.com/NYTimes/backbone.stickit#usage
【讨论】:
每当您使用模型属性与模板建立双重绑定时,您的视图需要再次呈现以显示更改。因此,您无法避免渲染以显示模型的更新状态。
但我建议您将视图划分为子视图。由于您使用的是木偶,您可以创建一个包含所有区域的主布局,并且对于每个小区域,您可以定义一个视图。
例如,假设我有一个包含我的姓名、当前时间和年龄的基本表单。所有这些变量都存储在一个模型中。因此,您有一个场景,您的姓名和年龄几乎没有变化,但当前时间每毫秒都在变化,导致您的整个视图重新渲染,这在性能和眼睛方面都很糟糕。
所以,为了解决上面的场景,如果你可以为当前时间元素创建一个单独的视图,你可以单独渲染,其他元素不需要一次又一次地渲染。如果您认为可以抽象其功能,则始终可以为单个按钮元素定义单独的视图。
【讨论】: