【问题标题】:How to update the view without re-rendering in marionette.js如何在不重新渲染 marionette.js 的情况下更新视图
【发布时间】:2015-06-26 22:35:16
【问题描述】:

如何使用model.fetch() 更新视图,即当我获取模型时,视图不应被破坏或重新渲染。它应该通过重置以前的模型来更新新模型。

this.model.fetch({success: this.render.bind(this)});

这段代码正在重新渲染我的视图..我怎样才能用新模型更新视图

谢谢。

【问题讨论】:

    标签: backbone.js model marionette fetch


    【解决方案1】:

    有多种方法可以根据您的需要更新视图。

    1. 如果视图相当简单,并且只需要在模型的 fetch 上自动更新视图,再次渲染视图是最简单的(可以使用模型上的 Backbone 同步事件,并且可以声明式处理模型事件使用 Marionette View 的 modelEvents 哈希 -http://marionettejs.com/docs/marionette.view.html#viewmodelevents-and-viewcollectionevents)

      modelEvents: {'sync': 'render'}
      
    2. 如果您在复杂视图中更改的模型属性很少,您可以通过监听模型属性上的更改事件通过 jquery 直接更新 dom 元素:

      modelEvents: {'change:name':'nameChanged'}, 
      nameChanged: function(model, value){ this.$('#name').val(value);}
      
    3. 如果需要在视图和模型之间进行双向数据绑定,可以使用像 Backbone.stickit 这样的框架 - https://github.com/NYTimes/backbone.stickit#usage

    【讨论】:

      【解决方案2】:

      每当您使用模型属性与模板建立双重绑定时,您的视图需要再次呈现以显示更改。因此,您无法避免渲染以显示模型的更新状态。

      但我建议您将视图划分为子视图。由于您使用的是木偶,您可以创建一个包含所有区域的主布局,并且对于每个小区域,您可以定义一个视图。

      例如,假设我有一个包含我的姓名、当前时间和年龄的基本表单。所有这些变量都存储在一个模型中。因此,您有一个场景,您的姓名和年龄几乎没有变化,但当前时间每毫秒都在变化,导致您的整个视图重新渲染,这在性能和眼睛方面都很糟糕。

      所以,为了解决上面的场景,如果你可以为当前时间元素创建一个单独的视图,你可以单独渲染,其他元素不需要一次又一次地渲染。如果您认为可以抽象其功能,则始终可以为单个按钮元素定义单独的视图。

      【讨论】:

      • 从技术上讲,您可以通过监听模型的更改然后使用 jQuery 更新视图的 html 元素来避免渲染视图,但不建议这样做。
      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 2017-12-31
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多