2013-12-19 18 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

あなたのobservableArrayがはい、(追加または削除された項目)を変更されたというメソッドを、サブスクライブ?それが本当であれば、追加/削除の2つのメソッドを追加し、それらの内部で検証を行う必要がありますか? – alexmac

答えて

4

現在、変更を停止する方法はありません。

beforeChangeイベントにサブスクライブし、変更前にアレイのコピーをキャッシュすることができます。何かのように:

+0

ええ、それは私が現在それをどのように扱っているかにはほど遠いです。私は彼らが変わったときに私が送信しているオブジェクトの変更に直接添付されたサーバーへの私の要求を保つという考えが好きでした。アイデアを共有していただきありがとうございます。 – beauXjames

2

別のアプローチを使用することができます - エクステンダを作成して、変更時にアレイを検証します。私は、指定された上限の整数の単純な配列を調べる簡単な例を作成しました。フィドル:http://jsfiddle.net/pkutakov/n2APg/1/ コード:

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

エクステンダーを使って入力を変更するのはとても便利です。私は同じ注文ロジックを少し追加して、どのような注文イベントが発生したかをテストしました。私はエクステンダーが実際にサブスクリプションの前に発生するが、サブスクリプションに返された「変更」は3.0チェンジ検査メソッドが無効であることを発見しました。 http://jsfiddle.net/n2APg/4 – beauXjames

+0

私はfiddleを修正しました:http://jsfiddle.net/n2APg/5/ – BenjiFB

+0

これはちょうど1行追加します:myVM.Data.push(13); – BenjiFB

関連する問題