4

新しいアイテムが追加されたときに、計算された監視可能な配列が更新されないという問題に直面しています。

self.FilteredCityList = ko.computed(function() {
  var filteredCollection = ko.utils.arrayFilter(self.CityListCollection(), function(r) {
    var matchingItem = ko.utils.arrayFilter(self.LocationCollection(), function(r1) {
      return r1.LocationCode() == r.LocationCode();
    });
    if (matchingItem.length > 0) {
     return false;
    }
    return true;
  });
  return filteredCollection;
}, this);

self.LocationCollection()計算された配列に項目を追加しても更新されません。

4

1 に答える 1

10

コメントでLocationCollection、問題の原因となったアイテムを追加するために次のコードを使用したと述べました。

self.LocationCollection().push(item);

どこ

self.LocationCollection = ko.observableArray();

ノックアウトの変更追跡を有効にするには、ドキュメントで説明されているようpushに、observableArray直接(たとえば、括弧なしで())呼び出す必要があります。

self.LocationCollection.push(item);

しかし、違いは何ですか?

呼び出しはko.observableArray()関数を返します。self.LocationCollection()基になる配列を取得するには、格納されている配列を返すこの関数(例)を呼び出す必要があります。

この時点でLocationCollection().push(item)呼び出すpushと、基になる配列が呼び出されるため、ノックアウトはそれを認識せず、計算されたオブザーバブルをトリガーしません。

そのため、ノックアウトでは、構文を使用して呼び出す必要のある独自のpushメソッドをそれ自体で定義しました。これはノックアウトのメソッドであるため、変更を正しく追跡します。observableArrayLocationCollection.push(item)

サンプルフィドル。

于 2012-12-02T07:58:30.017 に答える