2012-07-26 2 views
1

변경 사항을보기 모델을 모니터링하고 변경이 발생했음을 통지하는 knockout을 사용하여 시나리오를 만들려고합니다.이 작업은 정상적으로 작동하고 알림이 실행되지 않지만보기 및보기가 변경됩니다. 모델이 변경되면 알림이 다시 발생합니다.보기 모델이 삭제 될 때와 마찬가지로 속성이 계속 관찰되는 것과 같습니다.이 문제를 해결할 수있는 방법이 있습니다.노크 아웃 viewmodel 변경

  var options = { 
      callback: function() { 
       var type = "modelChanged"; 
       var subscription = $.config.core._subscriptions[type]; 
       if (subscription) { 
        $.config.core._subscriptions[type] = null; 
       } 
       self.savePersonalInformation(); 
      }, 
      event: "forceSave", 
      moduleId: "MemberInformationPersonalInfo" 
     }; 
     $.config.core.subscribeView(options); 

참고 : 구독보기는 기본적으로 구독 둘러싼 래퍼 인 사용자 지정 익스텐더입니다.

monitorPropertyValues: function (model) { 
     //subscribe to each property in the model to monitor changes to the value 
     // loop through all the properties in the model 
     for (var property in model) { 
      if (model.hasOwnProperty(property)) { 
       if (model[property].subscribe) { //subcribe to observable properties 
        // subscribe to changes 
        model[property].subscribe(function(value) { 
         if (value) { 
          $.config.core.notifySubscribers(true, "modelChanged"); 
         } 
        }); 
       } 
      } 

     } 
    } 

보기가 초기화 될 때 MonitorPropertyValues가 호출됩니다.

기본 동작은 다음과 같습니다. 각 탭마다 고유 한보기 모델이있는 페이지 목록이 있습니다. 탭을 클릭하면 뷰 모델 내에 변경 사항이 있는지 확인하려고합니다. 모든 변경 사항을 저장하기 위해 뷰 모델에 알림을 보내려는 경우.

+0

@Tyrsius 코어를 다시 작성하려고하지 않고 확장하려고 시도하고 있지만 modelChange 알림에서 내 등록 정보를 구독 취소 할 수 없습니다. 비어 있지만 작동하지 않는 _subscription 배열을 설정하려고했습니다. – user655261

답변

2

computed과 같은 기능을 구현하면 모든 속성을 자동으로 처리 할 수 ​​있습니다 (이 작업은 ko.toJS를 사용하여 수행되며 뷰 모델을 안내합니다). 이는 확장자보다 간단하며 처분 문제가 없어야합니다.

var viewModel = { 
    data: { 
     first: ko.observable("Ted"), 
     last: ko.observable("Smith") 
    }, 
    isChanged: ko.observable(false) 
} 

viewModel.allChanges = ko.computed(function() { 
    ko.toJS(viewModel.data); //just touches all observables, that's it. 
}); 

viewModel.allChanges.subscribe(function() { 
    if (!viewModel.isChanged()) { 
     viewModel.isChanged(true);  
    } 
}); 

ko.applyBindings(viewModel);​ 

이 솔루션은 RP Niemeyer의 바이올린에서 가져 왔지만 지금은 원본을 찾을 수 없습니다. 어쨌든, 신용은 그에게 간다.