Knockout.js を使用して、一連の HTML5<details>
要素を設定しています。構造は次のとおりです。
<div class="items" data-bind="foreach: Playlists">
<details class="playlist-details" data-bind="attr: {id: 'playlist-details-' + $index()}">
<summary>
<span data-bind="text: name"></span> - <span data-bind="text: count"></span> item(s)
<div class="pull-right">
<button data-bind="click: $parent.play, css: {disabled: count() == 0}, attr: {title: playbtn_title}" class="btn"><i class="icon-play"></i> Play</button>
<button data-bind="click: $parent.deleteList" class="btn btn-danger"><i class="icon-trash"></i> Delete</button>
</div>
</summary>
<div class="list" data-bind="with: items" style="padding-top: 2px;">
...
</div>
</details>
</div>
ViewModel のデータは次のようになります。
var VM = {
Playlists: [
{
name: "My Playlist1",
count: 3,
items: [<LIST OF SONG ID'S>],
playbtn_title: "Play this playlist"
},
{
name: "My Playlist2",
count: 5,
items: [<LIST OF SONG ID'S>],
playbtn_title: "Play this playlist"
},
{
name: "My Playlist3",
count: 0,
items: [],
playbtn_title: "You need to add items to this list before you can play it!"
}
]
};
詳細ビューの開閉状態を記憶する機能を追加したいです。jQuery
以前に and localStorage
1を使用してこの動作を実装しましたが、このプロジェクトでは、jQuery を使用する代わりに Knockout をネイティブに使用したいと考えています。
ページの読み込み時にisOpen
取得される ViewModel のプレイリストにプロパティを追加しました。localStorage
ただし、HTML5 仕様では、値ではなく、属性の有無のみを検索するように指定されているattr
ため、Knockout でバインディングを使用できないようです。open
ViewModel のプロパティが変更されたときに、Knockout で要素のopen
プロパティを追加および削除するにはどうすればよいですか?<details>
isOpen
1 : このように:
// On the initial page load.
contents += '<details ' + ((localStorage['tl_open_playlist-details-' + counter] == 1) ? 'open' : '') ' class="playlist-details" id="playlist-details-' + counter + '" data-name="' + escape(listname) + '">'
...
// Update storage when things are clicked.
$(document).on('DOMSubtreeModified', 'details.playlist-details', function() {
if ($(this).prop('open')) {
localStorage['tl_open_' + this.id] = 1;
} else {
delete localStorage['tl_open_' + this.id];
}
});