2014-01-13 138 views
0

我的推測是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()); 
+0

不,「可見」綁定僅爲**單向**:可見綁定會根據您傳遞給綁定的值隱藏或顯示相關DOM元素。 – nemesv

+0

因此,這與其他knockoutjs可觀察的屬性(如更新dom更新模型的文本)不同? – WillC

+0

是的,大多數綁定都是單向的,其中只有一些是雙向的,比如'value'或'hasFocus',它總是在文檔中描述給定的綁定是如何工作的。 – nemesv

回答

1

因爲如麥可思指出,有沒有辦法淘汰賽檢測由外碼任意顯着的變化,關鍵是通過設置visible綁定中使用的observable(所以Knockout知道發生了什麼)而不是通過直接操作DOM來創建任何必須更改可見性的代碼。幾乎總是最好讓Knockout完成所有的DOM操作,無論是本地還是通過自定義綁定。 MV *最重要的一點是,您擁有更新視圖的單一權限,而不是免費的。

+0

不確定我同意所有必須通過MV *模型去解決橫切關注的問題。可能有一些方法不是免費的。在這種情況下,控制將在全站性的手風琴控制中運行良好,並且不想用更具體的邏輯進行更改,但我明白你的觀點。 – WillC

+0

感謝您的幫助。我顯然錯誤地認爲2-way綁定是可見的等等。我認爲Knockout文檔可能對此更明顯...(其中一天)我將不得不弄清楚KO自定義綁定處理程序做這個工作。 – WillC