2

我正在为包含多个嵌套资源的资源开发单页视图。使用以下模板,我可以获得要呈现的顶级属性或集合,但不能同时呈现:

h1= @name
ul
  #decisions


class Happenator.Views.ShowHappening extends Backbone.Marionette.Layout
  template: "happenings/show"
  regions:
    decisions: "#decisions"

  initialize: ->
    @decisionsView = new Happenator.Views.Decisions(collection: @model.get("decisions"))
    # Uncomment to render @model.name, but lose the decisions
    # @bindTo(@model, "change", @render)

  onRender: ->
    @decisions.show(@decisionsView)

是否有一种可接受的方式来绑定顶级布局以在数据更改/到达时重新渲染,或者是否所有动态内容都支持进入子区域?

4

1 回答 1

6

布局呈现区域将管理的 DOM 元素。因此,再次调用render布局将强制重新渲染该区域的元素。这些地区将看到这一点并再次选择它们,但这将对您的应用程序产生各种其他负面影响,正如您所指出的。

处理此问题的简单方法是:

a) 有单独的更改:属性事件处理程序只更新已更改的数据

b)使用数据绑定解决方案为您执行此操作,例如https://github.com/theironcook/Backbone.ModelBinder

第三种选择是在您的布局中创建第二个区域,并使用模型填充该区域的 ItemView。然后,您可以在模型更改时重新渲染该视图:


h1= @name
ul
  #decisions

class Happenator.Views.HeaderView extends Backbone.Marionette.ItemView
  template: "happenings/model-template"
  initialize: ->
    @bindTo(@model, "change", @render)

class Happenator.Views.ShowHappening extends Backbone.Marionette.Layout
  template: "happenings/show"
  regions:
    header: "#header",
    decisions: "#decisions"

  initialize: ->
    @decisionsView = new Happenator.Views.Decisions(collection: @model.get("decisions"))
    @headerView = new Happenator.Views.HeaderView(model: @model)

  onRender: ->
    @decisions.show(@decisionsView)
    @header.show(@headerView)

如果是我,我会使用选项 #3 并在布局内嵌套另一个 itemview,用于模型渲染。这将为您在该视图中提供更多的自由和灵活性,使其与布局分开。

于 2012-06-19T01:41:48.903 回答