9

レイアウトがありますが、すべての領域が不明であるため、事前にすべての領域を定義することはできません。

後で ItemView が作成され、ビューの ID を領域の名前として使用してレイアウトに新しい領域を作成したいので、次のように言えます。

layout.dynamicRegionName.show(newItemView);

しかし、ここには循環依存があります。

  1. ビューをまだレンダリングしていないため、レイアウトの .addRegion() への呼び出しで使用される DOM 要素への参照を作成できません。

  2. .show() を呼び出して動的に追加された領域を介して DOM ツリーにアタッチしたいため、レンダリングできません。

@DerickBailey github の Marionette.Layout ドキュメントでは、次の例にエラーがあると思います。layout.show(new MenuView());

しかし、技術的には、これはここで必要なものに近いものです。つまり、次のことができるようになります。

layout.addRegion(VAR_WITH_NEW_REGION_NAME, aViewInstance);

これにより、新しいリージョンがレイアウト レンダリングに追加され、その内部でビュー インスタンスが直接レンダリングされます。

これを達成するための他の明らかな方法がありませんか?それは既知の不足している機能ですか? 持っていない理由はありますか?

この前の Q:「領域をレイアウトに動的に追加/削除する」は知っていますが、それに対する明確な/明確な回答はありません。

4

2 に答える 2

0

私のプロジェクトの 1 つで、同様の問題に直面しました。フォームを動的に作成する必要がありました。つまり、フォームには、実行前に決定できなかったさまざまなフィールド ビューが含まれていました。フィールドはかなり複雑な動作をしていたので、マリオネット ビューにする必要がありました。

私が 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 に答える