1

ここで良いタイトルを表現する方法がわかりませんでした。

私は基本的に開閉原理を使用しようとしているので、レンダリングするコンポーネントを正確に指定する必要はありませんが、代わりにインターフェイス/抽象クラスを使用するだけです。

ノードエディタを作っています。各ノードのデータを保持するための NodeModelBases のリストがあり、これらのそれぞれについて、レンダリングする対応する NodeComponent を挿入したいと考えています。現在:

<div class="diagram-html-layer">
            @foreach (NodeModelBase node in nodeModelManager.Nodes) {
                <NodeBase NodeModel="@node" OnDeleteEvent="OnDeleteNode"/>
            }
</div>

NodeModelBase は特定のタイプのノードによって継承されるという考え方なので、「StartNode : NodeModelBase」、「DelayNode : NodeModelBase」など、つまり NodeModelBase のサブクラスを持つことができます。潜在的に 20 以上のサブクラスを持つ可能性があり、新しく追加されたノード タイプごとに上記の for ループを更新したくありません。

次に、それぞれのコンポーネントをレンダリングします。現在、NodeBase という名前の Blazor コンポーネントがあります。これを挿入します。これは、これまでのところノード タイプが 1 つしかないためです。しかし、次のようなことができるようにしたいと思います: node.GetHTML() 代わりにこれを挿入します。

NodeModelBase のどのサブクラスがあるかを確認するために長い if-else を使用し、次のような正しいコンポーネントを挿入することができます。

if(node is StartNode) {
    <StartNode/>
} else if (node is DelayNode) {
    <DelayNode/>
} else ...

しかし、それはかなり不便です。

RenderTreeBuilder を使用し、builder.OpenElement(...) や builder.AddAttribute(...) などの呼び出しを行うことで、プログラムでこれを実行できることがわかっているため、結果は次のようになります。

<div class="diagram-html-layer">
            @foreach (NodeModelBase node in nodeModelManager.Nodes) {
                @node.GetRenderFragment();
            }
</div>

しかし、html/blazor の初心者である私は、html/razor 構文を通常どおりに定義し、何らかの方法でそれを返す/挿入できるようにしたいと考えています。

では、どのコンポーネントを挿入するかについて柔軟にする方法について何か提案はありますか?

4

0 に答える 0