5

同じタイプのオブジェクトのこの配列があるとします:

var people = [
    { status: 0, name: "name1"},
    { status: 1, name: "name2"}
];

そして、それをobservableArrayにするだけでなく、各オブジェクトのステータスプロパティなどだけを観察したいのです。

オブジェクト自体が追加または削除される可能性があると想像してください。これらのオブジェクトの name プロパティは変更されないため、実際に名前を監視する必要はありませんが、すべてのオブジェクトのステータスが変更される可能性があるため、監視可能にするとクールです。

いくつかのクールなハック構文を使用してノックアウト ユーティリティでマップすることは可能ですか、それともすべてのオブジェクトを反復処理してそのステータス プロパティを監視可能にマップするか、配列全体とそのオブジェクト プロパティを監視可能にする必要がありますか?

4

3 に答える 3

5

ko.mapping.fromJSを使用できます

var vm = ko.mapping.fromJS(people,{
    create: function(options){    
        return {
            status : ko.observable(options.data.status), // observable
            name: options.data.name, // non observable
        }
    }
});

現在、vm は、status が観測可能で、name が通常のプロパティであるオブジェクトを含む observableArray です。

フィドルを見る

@パトリック:

多くのプロパティがあり、1 つだけを監視可能に変換したい場合は、それを行うことができます。

var o = ko.mapping.fromJS(people,{create: function(options){
    // clone item
    var item = ko.utils.extend(options.data, {});
    // replace status property by an observable 
    item.status = ko.observable(options.data.status);
    return item;
}});

更新されたフィドルを参照してください

マッピングパラメーターで観察を使用することもできます

var mapping = {
    create: function (options) {
        return ko.mapping.fromJS(options.data, {'observe': ["status"]});
    }
};
var o = ko.mapping.fromJS(people, mapping);

フィドルを見る

お役に立てば幸いです。

于 2013-07-29T13:29:39.817 に答える
0

この質問が古いことは知っていますが、同じ問題に直面し、プラグインを使用せずに簡単な解決策を見つけました。

get リクエストを実行して、投稿の配列が返されたとしましょう。各エントリには、投稿がユーザーによってお気に入りに登録されているかどうかを示すブール値である「Favorited」というプロパティがあり、このプロパティを監視可能にして、その状態を変更する関数で作業できるようにします。

次のことができます。

function ViewModel() {
  var self = this;
  self.posts = ko.observableArray([]);

  $.getJSON("/api/getPosts", function(data) {
   ko.utils.arrayForEach(data, function(post) {
    post.Favorited = ko.observable(post.Favorited)
   });
   self.posts(data)
  });
}

このようにして、お気に入りのプロパティをその値でオブザーバブルに変更し、arrayForEach メソッド内で同じことを行って任意のプロパティをオブザーバブルに変更できます。

于 2014-10-06T22:43:01.813 に答える