0

動的ページ タイプを作成しています。特定の ContentArea にロードされたブロックに基づいて、さまざまなスクリプトをロードしたいと考えています。

これはエリアです:

[AllowedTypes(new[] { typeof(Types.SomeBlockType)})]
public virtual ContentArea SomeArea { get; set; }

私のページビューでは、コンテンツとスクリプトをレンダリングしています: (スクリプトレンダリングはレイアウト経由です)

@Html.PropertyFor(...)
.
.
@section Scripts {

    ...//some scripts loaded
}

私が抱えている問題は、SomeArea コンテンツのブロック内のスクリプトが、スクリプト セクションの前に実行されていることです。レイアウト スクリプトとページ スクリプトが読み込まれた後にブロック スクリプトを実行したい...

どんな助けにも感謝します。

4

2 に答える 2

6

答えは非常に簡単ですが、まずテンプレートが次のクライアント リソース要件を満たす必要がありますhttp://world.episerver.com/documentation/Items/Developers-Guide/EPiServer-CMS/75/Client-resources/Client-resources / . この記事では、ページ レベルでスクリプトを登録する方法について言及しています。この場合、要件を満たすすべてのテンプレートに挿入されます。つまり、ページ タイプ名は XFormPage です。

しかし、特定のブロックがページで使用されている場合にスクリプトを挿入したいとします。1 つの解決策は、記事のメソッドを使用してから、ページのコンテンツ領域のすべてのブロックを繰り返し処理し、ブロックが使用されているかどうかを確認することです。おそらく、最もスマートで最速のソリューションではありません。

より簡単な解決策は、ブロックのビューまたはコントローラーでスクリプトを要求することです。

var clientResources = ServiceLocator.Current.GetInstance<IRequiredClientResourceList>();

clientResources.RequireScript("/scripts/my-block-script.js", "BlockScript", new[] { "ScriptNameThatShouldExecuteBefore" }).AtFooter();

スクリプトに依存関係がない場合は、new[] { "ScriptNameThatShouldExecuteBefore" } の代わりに Enumerable.Empty() を渡すことができます。

于 2015-08-26T13:31:31.293 に答える
0

結局やったのは、スイッチケース付きのカミソリブロックをセットすることでしたが、

現在の Model.SomeArea.Items() (または Contents()) を調べますが、忘れていました。ブロックの種類を探し、必要なブロックと比較し、それに応じてスクリプトを読み込みます。

于 2015-08-28T15:15:30.910 に答える