2014-01-13 5 views
0

내 생각에 KnockOutJs "visible"바인딩은 양방향이므로 viewmodel 속성에 바인딩 된 dom 요소를 숨기면 observable에 대한 구독이 업데이트됩니다. JsBin http://jsfiddle.net/zb6E9/20/의 샘플은 관찰 가능 항목이 변경되면 구독이 실행되지만 dom 요소가 변경되면 구독이 실행되지 않는다는 것을 보여줍니다.KnockOutJs Visible Two-Way?

나는 뭔가를 놓쳐 야하지만, 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" /> 

자바 스크립트 : 마이클 베스트 지적으로, 녹아웃 외부 코드에 의한 임의의 눈에 보이는 변화를 감지하기위한 방법이 없습니다 때문에

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

아니요, 'visible'바인딩은 단방향 ** **입니다. 보이는 바인딩을 사용하면 바인딩에 전달한 값에 따라 연결된 DOM 요소가 숨겨 지거나 표시됩니다. – nemesv

+0

그래서 DOM을 업데이트하면 모델을 업데이트하는 텍스트와 같은 다른 knockoutjs 관측 가능한 속성과 다릅니다. – WillC

+0

그렇습니다. 대부분의 바인딩은 단방향입니다. 단,'value' 나'hasFocus'와 같은 양방향입니다. 주어진 바인딩이 어떻게 작동하는지 항상 문서에 설명되어 있습니다. – nemesv

답변

1

, 키가 가시성을 변경해야하는 코드를 만들려면 visible 바인딩에 사용 된 observable을 설정하여 DOM을 직접 조작하는 대신 Knockout이 무슨 일이 일어나는지 파악해야합니다. Knockout이 기본적으로 또는 사용자 정의 바인딩을 통해 모든 DOM 조작을 수행하는 것이 거의 항상 가장 좋습니다. MV *의 가장 중요한 점 중 하나는 무료로보기보다는보기를 업데이트하는 단일 권한을 가지고 있다는 것입니다.

+0

잘 모르겠지만, 크로스 커팅 문제에 대한 MV * 모델을 검토하는 데 모든 것에 동의합니다. 모든 사람들에게 자유롭지 않은 접근법이있을 수 있습니다. 이 경우 컨트롤은 잘 작동하고 더 구체적인 로직으로 변경하고 싶지 않을 사이트 전반의 accordian 컨트롤에있을 것입니다. 그러나 요점을 얻습니다. – WillC

+0

도움을 주셔서 감사합니다. 분명히 보이는 2 방법 바인딩에 대한 착각했다. 나는 Knockout 문서가 이것에 대해 조금 더 명백 할 수 있다고 생각한다. (요즘 중 하나) 나는 KO 커스텀 바인딩 핸들러를 알아 내야 할 것이다. 이 일을하라. – WillC