knockout.js はかなり新しいものです。私は C# です。しかし、私の新しい仕事には、バックエンドに加えて多くのフロント エンドが含まれているため、最終的にこれに取り掛かりました。
とにかく、JQuery のクリック イベントから viewModel メソッドを呼び出したいという異常なシナリオに (私が思うに) 遭遇しました。おそらくこれはよくあることですが、よくわかりません::誰かが助けてくれることを願っています!
viewModel ファイルに単純な関数があります。
//add to playlist
self.addToPlaylist = function (video) {
self.addedVideos.push(video);
};
ファンシーボックスと呼ばれるJqueryライブラリを使用して、多数の画像をカルーセルにロードしているため、ビデオと呼ばれるobservableArrayにバインドしています
<div id="carousel" data-bind="foreach: videos">
<!-- Left and right buttons -->
<input id="left-button" type="button" value="" />
<input id="right-button" type="button" value="" />
<!-- All images with class of "cloudcarousel" will be turned into carousel items -->
<!-- You can place links around these images -->
<a class="fancybox-iframe" href="#" rel="group">
<img class="cloudcarousel" width="160" height="121" alt="test" data-bind="attr: {src: videoThumbnail, url: videoUrl, id: videoId, title: videoTitle, caption: videoCaption}"
onclick="previewVideo($(this).attr('url'), $(this).attr('caption'));CreateAddVideoClipButton($(this).attr('id'));" />
</a>
</div>
これは、この div の完全な html です。の data-bind 属性内に click: $parent.addToVideos を含めるのが理想的ですが、この段階ではリッスンしているクリックが発生しないため、追加ボタンをレンダリングする必要があります。クリックするとfancyboxでプレビューが開き、ユーザーはウィンドウを閉じるか、[追加]をクリックしてこのビデオを配列に追加できるという考えです。
わかりました、うまくいけば、それは人々にとって理にかなっています...
私の Jquery メソッド CreateAddVideoClipButton には、次のものがあります。
var userModel = new VideosViewModel();
var text = "<a href='#' data-bind='click: userModel.addToPlaylist'>Add Video</a>";
そして、これが私が立ち往生しているところです。この段階でクリックを許可する方法を知る必要があります。viewModel で addToPlaylist メソッドを呼び出します。
これを理解するためにさらに情報が必要な場合は、お知らせください。
編集:投稿されたコード
ビューモデル:
function VideosViewModel() {
var self = this;
//Array of videos
self.videos = ko.observableArray([
{ videoTitle: "Video Title",
videoId: "1",
videoThumbnail: "images/image.png",
videoAlt: "Alt text",
videoUrl: "videos/video.mp4",
videoCaption: 'video caption text' },
]);
//Array of added videos
self.addedVideos = ko.observableArray([]);
//add to playlist
self.addToPlaylist = function (video) {
self.addedVideos.push(video);
alert("Added to playlist");
};
//remove from playlist
self.removeFromPlaylist = function (video) {
self.addedVideos.remove(video);
};
}
ko.applyBindings(new VideosViewModel());
HTML:
<div id="carousel" data-bind="foreach: videos">
<!-- Left and right buttons -->
<input id="left-button" type="button" value="" />
<input id="right-button" type="button" value="" />
<!-- All images with class of "cloudcarousel" will be turned into carousel items -->
<!-- You can place links around these images -->
<a class="fancybox-iframe" href="#" rel="group">
<img class="cloudcarousel" width="160" height="121" alt="test" data-bind="attr: {src: videoThumbnail, url: videoUrl, id: videoId, title: videoTitle, caption: videoCaption}",
onclick="previewVideo($(this).attr('url'), $(this).attr('caption'));CreateAddVideoClipButton($(this).attr('id'));" />
</a>
</div>
ビデオクリップ機能を追加
function CreateAddVideoClipButton(selectedVideoId) {
var theElement = document.getElementById(selectedVideoId);
var videoUrl = theElement.getAttribute('url');
var videoThumb = theElement.getAttribute('src');
var videoTitle = theElement.getAttribute('title');
var videoId = theElement.getAttribute('id');
selectedImageId = videoId;
//var userModel = new VideosViewModel();
var text = "<input type=\"button\" id=\"addButton\" class=\"addButton\" value=\"Add Video Clip\" onclick=\"addVideo(" + "'" + videoUrl + "'" + ", " + "'" + videoThumb + "'" + "," + "'" + videoTitle + "'" + "," + "'" + videoId + "'" + ");\" />";
//var text = "<a href=\"#\" onclick=" + userModel.addToPlaylist() + "\">Add Video</a>";
currentimageid = text;
currentSelectedImageId = selectedImageId;
hidePlayer();
}