2014-01-13 57 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