Dynamic 向木偶布局动态添加区域

Dynamic 向木偶布局动态添加区域,dynamic,backbone.js,marionette,regions,Dynamic,Backbone.js,Marionette,Regions,我有一个布局,但不能预先定义它的所有区域,因为它们是未知的 因此,稍后将创建一个ItemView,我想在布局中使用视图的ID作为区域名称创建一个新区域,这样我就可以说: layout.dynamicRegionName.show(newItemView); 但这里存在循环依赖 我还没有呈现视图,因此无法在布局对.addRegion()的调用中引用其DOM元素 我无法渲染它,正是因为我希望它通过调用其.show()通过动态添加的区域连接到DOM树 @DerickBailey在github中的木偶

我有一个布局,但不能预先定义它的所有区域,因为它们是未知的

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

layout.dynamicRegionName.show(newItemView);
但这里存在循环依赖

  • 我还没有呈现视图,因此无法在布局对.addRegion()的调用中引用其DOM元素

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

  • @DerickBailey在github中的木偶网.Layout文档中,我认为示例中有一个错误:
    Layout.show(new MenuView())

    但从技术上讲,这接近于我们需要的,即能够:

    layout.addRegion(VAR_WITH_NEW_REGION_NAME, aViewInstance);
    
    并让它将一个新区域直接添加到视图实例中的布局渲染中

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

    我知道之前的一个问题:“ 但是没有看到任何明确的答案。

    木偶1.0版(目前是最新版本)支持布局中的动态区域

    
    var MyLayout = Marionette.Layout.extend({
      template: "#some-template"
    });
    
    var layout = new MyLayout();
    layout.render();
    
    layout.addRegion("someRegion", "#some-element");
    
    layout.someRegion.show(new MyView());
    

    在我的一个项目中,我遇到了类似的问题。我需要动态创建一个表单,也就是说,表单将包含不同的字段视图,而这些字段视图在运行时之前无法确定。我需要的领域是木偶视图,因为他们有相当复杂的行为

    我在
    CoffeeScript
    中的木偶1.4中所采用的方法:

      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
    
    class Module.additionaloptions布局扩展了木偶.Layout
    标记名:“窗体”
    初始化:(选项={})->
    @_FieldView=options.FieldView | |【】
    onRender:->
    @_showFields@_fieldview
    _展示区:(现场视图)->
    fieldView.forEach(fieldView)=>@_addRegion().显示fieldView
    _addRegion:->
    regionClass=\.uniqueId('field-region\\')
    @$el.append$(“”)
    @addRegion regionClass,'.'+regionClass
    

    请让我知道,如果它需要进一步的解释,或者我可以澄清这在JS。我也知道这是一个迟来的答案,但是,希望有人能发现它仍然有用。另外,请注意-该答案仅与木偶1.x相关

    有用的答案。我的问题如下。元素(#某个元素)是否需要在模板中?换句话说,模板是否包含该元素,或者addRegion方法是否为我附加该元素?请参见我的问题。是的,模板必须包含el。所以addRegion有点奇怪:-/不太奇怪。区域是仅围绕给定元素的容器。同样,当你删除一个区域时,它不会删除DOM元素,只会删除区域对象。@backdesk我理解它是这样工作的,但仅仅因为它是作者想要的功能,并不意味着从最终用户的角度看它并不奇怪。为了“添加区域”,我仍然需要一个包装el,这确实让人感到奇怪。在谷歌搜索“动态木偶区域”之后,我提出了这个问题,希望我能够有一个空的根元素,可以连接不同的区域。这就是人们听到“动态”时通常的想法。对我来说,这听起来很静态。