9

我有一个布局,但无法提前定义其所有区域,因为它们是未知的。

所以稍后创建了一个 ItemView ,我想在布局中创建一个新区域,使用视图的 ID 作为区域的名称,这样我就可以说:

layout.dynamicRegionName.show(newItemView);

但是这里有循环依赖。

  1. 我还没有渲染视图,所以我无法引用它的 DOM 元素以在布局调用 .addRegion() 时使用

  2. 我无法渲染它,正是因为我希望它通过调用它的 .show() 通过动态添加的区域附加到 DOM 树

@DerickBailey 在 github 的 Marionette.Layout 文档中,我相信示例中存在错误:layout.show(new MenuView());

但从技术上讲,这接近我们在这里需要的,即能够做到:

layout.addRegion(VAR_WITH_NEW_REGION_NAME, aViewInstance);

并让它直接在视图实例内部的布局渲染中添加一个新区域。

我是否错过了其他一些明显的方法来实现这一目标?这是一个已知的缺失功能吗?有没有理由不拥有它?

我知道这个先前的问题:“动态添加/删除区域到布局”但没有看到任何明确/明确的答案。

4

2 回答 2

19

Marionette v1.0(v1.0.2 是最新的,现在)支持布局中的动态区域。


var MyLayout = Marionette.Layout.extend({
  template: "#some-template"
});

var layout = new MyLayout();
layout.render();

layout.addRegion("someRegion", "#some-element");

layout.someRegion.show(new MyView());
于 2013-03-30T03:51:22.037 回答
0

在我的一个项目中,我遇到了类似的问题。我需要动态创建一个表单,即该表单将包含在运行前无法确定的不同字段视图。我需要这些字段是 Marionette 视图,因为它们的行为非常复杂。

我在 Marionette 1.4 中所做的方式CoffeeScript

  class Module.AdditionalOptionsLayout extends Marionette.Layout
    tagName: 'form'

    initialize: (options = {}) ->
      @_fieldViews = options.fieldViews || []

    onRender: ->
      @_showFields @_fieldViews

    _showFields: (fieldViews) ->
      fieldViews.forEach (fieldView) => @_addRegion().show fieldView

    _addRegion: ->
      regionClass = _.uniqueId('field-region__')
      @$el.append $("<div class=\"#{regionClass}\"></div>")
      @addRegion regionClass, '.' + regionClass

请让我知道是否需要进一步解释,或者我可以在 JS 中澄清这一点。我也知道这是一个迟到的答案,但是,希望有人能发现它仍然有用。另外,请注意 - 答案仅适用于 Marionette 1.x

于 2019-02-22T11:09:47.077 回答