ノックアウトでは、開いている他のすべての行を折りたたんで、クリックした行だけを展開することができます。1つの要素を展開してノックアウトjs内の他の要素をすべて折りたたむjs
私はこれをFiddle exampleといいます。
ビュー -
<ul data-bind="foreach: items"> <a href="#" data-bind="click: toggle, text:linkLabel"></a>
<button data-bind="text:name"></button>
<div data-bind="visible:expanded">
<input data-bind="value:name"></input>
</div>
</ul>
ビューモデル - ここ
function Sample(item) {
var self = this;
self.name = ko.observable(item.name);
self.id = ko.observable(item.id);
self.expanded = ko.observable(false);
self.toggle = function (item) {
self.expanded(!self.expanded());
};
self.linkLabel = ko.computed(function() {
return self.expanded() ? "collapse" : "expand";
}, self);
}
var viewModel = function() {
var self = this;
var json = [{
"name": "bruce",
"id": 1
}, {
"name": "greg",
"id": 2
}]
var data = ko.utils.arrayMap(json, function (item) {
return new Sample(item); // making things independent here
});
self.items = ko.observableArray(data);
};
ko.applyBindings(new viewModel());
その崩壊しない既に開いて行。トグル機能で完全な項目を取得しようとしましたが、機能しませんでした。
私はノックアウトするのは新しいです。提案してください。
アップデート -
私は、デフォルトで拡張最初のものにするために、このコードを試してみました - 予想通り
var index=0;
var data = ko.utils.arrayMap(json, function(item) {
if(index++===0){
return new Sample(item,true);
}else{
return new Sample(item,false);
}
});
しかし、与えられたコード上では動作しません。
ありがとうございました。いい説明。ノックアウトで利用可能なものはありますか?最初のものをデフォルトで拡張することができます。 –
最も簡単な方法は、おそらく 'if(self.items()[0])self.items()[0] .expanded(true)'をビューモデルコンストラクタの一番下に追加することです。 – user3297291
あなたがマッピング関数でそれをしたいなら、あなたはすることができます: 'json.map(function(item、index){return new Sample(item、!index)})'。 '0'以外のインデックスは' true'と評価されるので、最初のインデックスのみが展開されます。 – user3297291