7

配列に変更が加えられました。サンダーソンの最新の配列サブスクリプション メソッドを使用して、追加/削除の変更をキャッチしています。このサブスクリプションでは、要求をバンドルしてネットワーク経由で送信する予定です。何らかの理由でリクエストが失敗した場合、コレクションへの変更をキャンセルできるようにしたいと考えています。変更が反映される前にこのサブスクリプションがヒットしたことを確認したので、「やらないでください」と言う方法があると思いますが、方法がわかりません。

私の例として...

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');

「これ」を調べると、標準の [callback, dispose, disposeCallback, target] を使用した ko.subscription オブジェクトが表示されますが、「やめてはいけない」ということにはならないようです。

どんな考えでも非常に役に立ちます。ありがとう。

4

2 に答える 2

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));
于 2013-12-20T08:06:37.350 に答える