隨着調試JS代碼中綁定定義如下爲什麼KO不是基於表達式創建觀察值?
<div data-bind="myBinding: { ... }, enable: isEnable() && isThatEnabled()"></div>
,當我看着在myBinding的init的allBindings其定義像一般:
init: function (element, valueAccessor, allBindings, viewModel, bindingContext)
我看到allBindings.enable
是一個布爾值,這是isEnable() && isThatEnabled()
的實際計算值。這不是像我預期的基於布爾表達式創建的可觀察值。
我的問題是爲什麼它不是一個可觀察的?
在這種情況下是否可以從myBinding
觀察「啓用」綁定?
我看到3個選項:
定義自定義
enable
結合:<div data-bind="myBinding: { ... }, myEnable: isEnable() && isThatEnabled()"></div>
有
myBinding
一個 '啓用' 參數:<div data-bind="myBinding: { enable: isEnable() && isThatEnabled() }"></div>
使用計算觀察到在HTML:
data-bind="myBinding: bar, enable: ko.computed(function() { return foo() && foo2(); })"
第二屆一個似乎最合理的給我。
var model = {
foo: ko.observable(true),
foo2: ko.observable(true),
bar: ko.observable(1)
};
ko.bindingHandlers.myBinding = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var value = valueAccessor();
var valueUnwrapped = ko.unwrap(value);
element.innerHTML += ko.isObservable(allBindings().enable);
// how unfortunate, 'enable' binding value is not observable
// how to listen to 'enable' binding changes right here?
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var value = valueAccessor();
var valueUnwrapped = ko.unwrap(value);
}
};
function onload() {
ko.applyBindings(model);
}
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body onload="onload()">
<input type="checkbox" data-bind="checked: foo">
<input type="checkbox" data-bind="checked: foo2">
<button data-bind="myBinding: bar, enable: foo() && foo2()">Is 'enable' binding observable: </button>
</body>
</html>
你使用哪個版本的'ko'?我不能用'ko-3.3.0'重現這個。出乎意料的是,即使使用普通的js函數!我的沙箱:http://jsbin.com/cituzifuca/edit –