我的推測是KnockOutJs「可見」綁定是雙向的,所以如果我隱藏綁定到viewmodel屬性的dom元素,則更新observable。我在JsBin http://jsfiddle.net/zb6E9/20/中的示例顯示,如果observable發生更改,則訂閱將觸發,但如果dom元素更改,則訂閱不會觸發。KnockOutJs可見雙向?
我必須缺少一些東西,但如何使jQuery按鈕觸發訂閱?
HTML:
<input id="firstNameInput" data-bind="value: firstName, visible: isVisible" value="First" /><br />
<input data-bind="value: lastName" value="Last" /><br />
The name is <span data-bind="text: fullName"></span><br />
<input type="button" data-bind="click: changeVisibility" value="Change Visibility using KnockOut" /><br />
<input type="button" onclick="changeVisibilityJQuery()" value="Change Visibility Using jQuery" />
的Javascript:
function changeVisibilityJQuery()
{
if($('#firstNameInput').is(':visible')){
$('#firstNameInput').hide();
} else {
$('#firstNameInput').show();
}
}
function AppViewModel() {
var self = this;
self.firstName = ko.observable('First');
self.lastName = ko.observable('Last');
self.isVisible = ko.observable(true);
self.changeVisibility = function(){
var v = self.isVisible() || false;
self.isVisible(!v);
};
self.isVisible.subscribe(function(bool) {
if (bool) {
// DO SOMETHING SUCH AS
self.firstName(self.firstName() + " " + bool);
}
});
self.fullName = ko.computed(function() {
return self.firstName() + " " + self.lastName();
});
}
ko.applyBindings(new AppViewModel());
不,「可見」綁定僅爲**單向**:可見綁定會根據您傳遞給綁定的值隱藏或顯示相關DOM元素。 – nemesv
因此,這與其他knockoutjs可觀察的屬性(如更新dom更新模型的文本)不同? – WillC
是的,大多數綁定都是單向的,其中只有一些是雙向的,比如'value'或'hasFocus',它總是在文檔中描述給定的綁定是如何工作的。 – nemesv