2013-12-19 1 views
7

배열에 변화가 생겼습니다. 나는 Sanderson의 최신 배열 구독 방법을 사용하여 추가/삭제 변경 사항을 잡으려고합니다. 이번 구독에서 나는 묶어서 내 요청을 유선으로 보내려합니다. 어떤 이유로 든 요청이 실패하면 콜렉션에 대한 가능한 변경을 취소 할 수 있기를 원합니다. 변경 사항이 전파되기 전에이 구독이 적용된다는 사실을 확인 했으므로 "중지하지 마십시오"라고 말하면 어떻게 될지 생각할 수 있습니다. 내 예를 들어 녹아웃 3.0이있는 관측 가능한 배열에 대한 변경을 어떻게 취소 할 수 있습니까?

...
self.SourceData = ko.observableArray(data); 
self.SourceData.subscribe(function(changes) { 
    var isAllGood = true; 
    ko.utils.arrayForEach(changes, function(ch) { 
     if (ch.value == doesNotMeetMyCondition) isAllGood = false; 
    }); 
    if (!isAllGood) <STOP DON'T DO IT> 
}, null, 'arrayChange'); 

검사 '이'나는 [disposeCallback, 대상을 폐기, 콜백] 표준과 ko.subscription 객체를 참조 할 수 있지만, 아무것도 DON를 중지하려면 금액 것 같다 '할.

어떤 생각이든 도움이 될 것입니다. 감사.

+0

? 사실이라면, 추가/삭제라는 두 가지 메소드를 추가하고 그 내부에서 유효성 검증을 수행해야할까요? – alexmac

답변

4

현재 변경을 중단하는 방법이 없습니다.

잠재적으로 beforeChange 이벤트를 구독하고 변경하기 전에 배열 복사본을 캐싱 할 수 있습니다. 예 :

self.SourceData.subscribe(function(value) { 
    /store copy, in case it needs to be restored 
    self.beforeSourceData = value && value.slice(); 
}, null, "beforeChange"); 
+0

그래, 내가 현재 어떻게 처리하고 있는지와는 거리가 멀다. 나는 그들이 변경 될 때 내가 보내고있는 객체의 변경에 직접적으로 첨부 된 서버에 대한 나의 요청을 유지할 생각을했다. 아이디어를 공유해 주셔서 감사합니다. – beauXjames

2

다른 접근법을 사용할 수 있습니다. 변경할 때 어레이 유효성을 검사하려면 다른 방법을 사용할 수 있습니다. 나는 지정된 상한에 대해 정수의 간단한 배열을 검사하는 단순화 된 예제를 만들었습니다. 바이올린 : http://jsfiddle.net/pkutakov/n2APg/1/ 코드 :

당신은 예, 당신의 observableArray이 변경되면, (추가 또는 삭제 된 항목)라는 방법을 구독
ko.extenders.checkValue=function (value, condition){ 
    var result=ko.computed({ 
     read: value, 
     write: function (newValue){ 
      var current=value(); 
      var canSave=true; 
      ko.utils.arrayForEach(newValue, function(ch) { 
       if (ch>condition) 
        canSave=false; 
      }); 
      if (canSave) 
      { 
       value(newValue); 
       value.notifySubscribers(newValue); 
      } 
      else 
       value.notifySubscribers(value()); 
     } 
    }).extend({ notify: 'always'}); 
    result(value()); 

    //return the new computed observable 
    return result; 
} 

function AppViewModel(data) 
{ 
    self=this; 
    self.Data=ko.observableArray(data).extend({ checkValue: 100}); 
} 

var mydata=[10, 11]; 
ko.applyBindings(new AppViewModel(mydata)); 
+0

입력을 변경하기 위해 Extender를 사용하는 것이 좋습니다. 이벤트가 발생한 순서를 테스트하기 위해 동일한 구독 로직을 조금 추가했습니다. 실제로 Extender는 구독 전에 발생하지만 구독에 반환 된 '변경 사항'은 이제 3.0 변경 검사 메서드가 무효라는 사실을 발견했습니다. http://jsfiddle.net/n2APg/4 – beauXjames

+0

나는 바이올린을 수정했다 : http://jsfiddle.net/n2APg/5/ – BenjiFB

+0

그냥 한 줄을 추가한다 : myVM.Data.push (13); – BenjiFB

관련 문제