내 생각에 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());
아니요, 'visible'바인딩은 단방향 ** **입니다. 보이는 바인딩을 사용하면 바인딩에 전달한 값에 따라 연결된 DOM 요소가 숨겨 지거나 표시됩니다. – nemesv
그래서 DOM을 업데이트하면 모델을 업데이트하는 텍스트와 같은 다른 knockoutjs 관측 가능한 속성과 다릅니다. – WillC
그렇습니다. 대부분의 바인딩은 단방향입니다. 단,'value' 나'hasFocus'와 같은 양방향입니다. 주어진 바인딩이 어떻게 작동하는지 항상 문서에 설명되어 있습니다. – nemesv