下面是一個不需要很多jQuery的解析的另一種方式。事實上,根本沒有jQuery - 只是純粹的淘汰賽。
從Knockout documentation
注1:傳遞一個「當前項目」作爲參數傳遞給你的處理 功能
當調用您的處理程序,淘汰賽將提供電流模型 值作爲第一參數。如果您爲某個集合中的每個項目呈現一些UI,並且您需要知道 哪個項目的UI已被點擊,此功能特別有用。
HTML
我們將加載從ko.observableArray()
中的項目,我們可以很容易地通過JS操縱它。爲了在視圖中顯示,我們使用foreach
。
通過敲除HTML的評論,我們可以設置兩個條件,顯示li
有active
類,或不是。
<ul data-bind="foreach: places">
<li>
<!-- ko if: $root.activeItem() !== $data -->
<span data-bind="text: $data, click: $parent.setActive"></span>
<!-- /ko -->
<!-- ko ifnot: $root.activeItem() !== $data -->
<span data-bind="text: $data, click: $parent.setActive, attr: { class: 'active'}"></span>
<!-- /ko -->
</li>
</ul>
現在,我們只需在place
傳遞給函數setActive()
。這分配給ko.observable()
activeItem
。在上面的標記中,詢問是否是循環中的activeItem
。
的JavaScript
function MyViewModel() {
var self = this;
self.places = ko.observableArray(['London', 'Paris', 'Tokyo']);
self.setActive = function(place) { self.activeItem(place) }
self.activeItem = ko.observable()
}
ko.applyBindings(new MyViewModel());
例
http://codepen.io/ajkochanowicz/pen/maylx
你的溶液工作除我很好除去線'值($(元件).find(「按鈕。主動')。data('value'));'在init部分。一個問題:在init部分,你有一些代碼removeClass然後addClass。我們在更新部分找到了相同的內容。調試時,我清楚地看到它的工作原理,但我不明白爲什麼要在兩個不同的地方做這件事?不管怎麼說,還是要謝謝你。 – Bronzato
您刪除的行用於初始化「活動」類的初始位置的視圖模型屬性。點擊按鈕時,第一個removeClass/addClass(在點擊事件處理程序中)用於更改「活動」類。第二個removeClass/addClass用於在更改視圖模型屬性時更改「活動」類。 – gbs