優れたCycle.jsプラグインを使用して単純なコンテンツローテーターを作成しました。これにより、Knockout.JSビューモデルプロパティ(この場合はappViewModel.mediaPlayer)からコンテンツが取得されます。
例えば
var testData = [{ url: "media/1.png" }, { url: "media/2.jpg"}];
var appViewModel =
{
mediaPlayer: new ko.observableArray(testData)
};
ko.applyBindings(appViewModel);
これは、JQueryTmplを使用してビューにレンダリングされます。
<script id="mediaPlayerTemplate" type="text/template">
<img src=${url} />
</script>
<div class="adContainer" data-bind="template: {name: 'mediaPlayerTemplate', foreach: mediaPlayer}">
</div>
画像の遷移を開始するには、Cycleプラグインメソッドを「cycle」と呼びます。
$('.adContainer').cycle({
fx: 'fade',
timeout: 1000,
speed: 500
});
これはうまく機能しますが、ビューモデルのメディアプレーヤーコンテンツを更新すると、cycleプラグインが機能しなくなります... cycle()を呼び出すだけで再開されるため、これは問題ではありません。
ただし、私の質問は、ビューを更新するためにcycle()を呼び出すのに最適な場所はどこですか?必要に応じてメソッドを呼び出すだけで、mediaPlayerの変更をサブスクライブできると思いましたが、これは、JQuery要素/ビューロジックをビューモデルに配置する必要があることを意味します。 。
つまり、ビューモデルがビュー関数について知らなくても、ビューモデルからビューの関数をトリガーするにはどうすればよいですか?Silverlight / WPFでは、これはXAMLのトリガーで可能でしたが、Knockout.JSを使用して同じ分離を実現する方法がわかりません。