5

ノックアウトJSに問題があり、わかりません

2 つの observableArray があります。1 つは利用可能なすべてのアイテムを含み、もう 1 つは選択されたすべてのアイテムを含みます。

使用可能なすべてのアイテムを含む新しい配列を返すにはどうすればよいですか (選択したすべてのアイテムが削除されます)。

4

4 に答える 4

2

標準の removeAll メソッドでこれを処理する必要があります。ドキュメントから:

myObservableArray.removeAll(['Chad', 132, undefined]) は、'Chad'、123、または undefined に等しいすべての値を削除し、それらを配列として返します

元の利用可能なすべてのアイテムの配列を変更せずに、利用可能なアイテムを抽出する必要がありますか?

于 2013-11-05T16:02:25.670 に答える
1

EDIT:

Since my specific problem, was observableArrays containing objects ( which i failed to state in my question ). The answers provided did not fix my problem, although, it did answer the question nicely, which is why i am not changing answer.

for anyone interested in how i solved the problem, here is the code:

    var self = this;
    self.users = ko.observableArray([]);
    self.roles = ko.observableArray([]);
    self.selectedUser = ko.observable();

    self.remainingOptions = ko.computed(function () {
        return (self.roles()).filter(function (option) {
            var current = option.Name();
            var keep = true;
            if (self.selectedUser() !== undefined) {
                ko.utils.arrayFirst(self.selectedUser().Roles(), function (item) {

                    if (keep) {
                        keep = (current !== item.Name());
                    }
                    return (current === item.Name());
                });
            }
            return keep;
        }); //end  filter
    }); //end remaininOptions

the Role object is just an object with a Name property.

于 2013-11-24T06:10:44.153 に答える
1

元の配列を変更せずに新しい配列を返したい場合は、計算されたオブザーバブルを使用するのが最善の策です。

var ViewModel = function(){
    this.available = ko.observableArray([1,2,3,4,5]);
    this.selected = ko.observableArray([1,3,5]);

    this.remaining = ko.computed(function(){
        var remaining = ko.observableArray();
        remaining(ko.toJS(this.availableOptions))
        remaining.removeAll(this.selectedOptions());
        return remaining();
    }, this);
}

実際の例へのリンクは次のとおりです。

http://jsfiddle.net/nathanjones/p3RMD/

編集:サンプルコードを修正。

于 2013-11-05T16:27:47.287 に答える