[英]Knockout click binding strange behavior
嘗試獲取基本的Knockout點擊綁定設置,如下例所示:
<button id="btn-a" class="btn" data-bind="css: {'btn-primary':mode() == 'manual'}, click: $root.mode('manual')">Manual</button>
<button id="btn-b" class="btn" data-bind="css: {'btn-primary':mode() == 'automatic'}, click: $root.mode('automatic')">Automatic</button>
<label>MODE: </label><span data-bind="text:mode()"></span>
<script>
$(function () {
var TestModel = function() {
var self = this;
this.mode = ko.observable('manual');
};
var testModel = new TestModel();
window.testModel = testModel;
ko.applyBindings(testModel);
});
小提琴: http : //jsfiddle.net/aq85wk65/
但是,遇到兩個問題:
mode()
值以'automatic'開頭,即使我們將其顯式初始化為'manual'。 未捕獲的TypeError:h.apply不是函數
您需要將您的點擊處理程序包裝在函數中:
http://jsfiddle.net/aq85wk65/1/
<button id="btn-a" class="btn" data-bind="css: {'btn-primary':mode() == 'manual'}, click: function(){$root.mode('manual')}">Manual</button>
問題是你的click
處理程序正在調用函數而不是使用它的引用。
這就是為什么你最終將mode
為auto
,因為click: $root.mode('automatic')
正在設置可觀察值。
試試這個:
click: $root.mode.bind($root, 'manual')
.bind
答案或function() {}
答案都可以正常工作; 但通常我更願意盡可能避免在我的視圖中定義函數,而是將該邏輯移到ViewModel。
所以另一種選擇,在這種情況下我可能會選擇的是定義一個viewModel.setToManual()
函數和一個viewModel.setToAutomatic()
函數。
那么綁定處理程序就是這樣
click: setToAutomatic
不僅視圖中更清晰,而且它還保護視圖不受ViewModel結構的更改,只要保留setToAutomatic
(可能是可比較的isAutomatic
)的行為setToAutomatic
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.