2013-07-29 40 views
5

說我有這個數組同類型的對象:打開某些observableArray對象的屬性變成可觀察

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

,我希望它不僅是observableArray,而且我想只能觀察,比如說,狀態屬性的每個對象。

想象一下,可能會添加或刪除對象本身。任何這些對象的名稱屬性都不會改變,所以我不需要觀察名稱,但是每個對象的狀態可能會發生變化,因此使其可觀察是很酷的。

是否有可能使用一些很酷的hack語法將其與knockout實用程序進行映射,還是必須迭代每個對象並將其狀態屬性映射到observable或讓整個數組及其對象屬性可觀察?

回答

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

現在虛擬機是包含在其中的地位是obsevable和名稱是一個普通的屬性對象的observableArray。

See fiddle

@Patryk:

你能做到這一點,如果你有很多的屬性,你想只有一個轉化爲可觀察的。

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

See updated fiddle

你也可以使用observe與映射參數

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

See fiddle

我希望它能幫助。

+1

如果對象具有更多的屬性,我希望只有一個屬性是可觀察的,那麼我需要明確列出每個屬性,而不管是否可觀察? – patryk

+0

來到這樣的東西,但你的方式看起來更專業:我再次好奇的是一件簡單的事情:是'var vm = ko.mapping.fromJS(data,{});'與'var vm; ko.mapping.fromJS(data,{},vm);' – patryk

+0

第一個調用是用於初始調用,第二個用於更新。 更新「意味着」當您從服務器收到「新鮮」數據時,您需要更新現有視圖模型。 – Damien

1

我建議使用copy

,這樣可以提供你想不可觀的屬性的數組。

var mappingPeople = { 
    'copy': ["name"] 
}; 

var mapping = { 
    create: function (opts) { 
     return ko.mapping.fromJS(opts.data, mappingPeople); 
    } 
}; 
var PeopleArr = ko.mapping.fromJS(people, mapping); 

這裏是Working Demo

更新

如果您需要標記一個屬性作爲觀察到,其餘「會是正常的特性的話,我建議使用observe

這裏是使用observe

+0

這仍然使我需要列出所有我不希望成爲觀察對象的屬性,這些屬性是多數。我的目標是僅列出我想觀察的那些。我按照達米恩的說法做到了,並不完全如此清晰,但卻很有效。 – patryk

+0

@patryk在這種情況下,你需要使用'觀察'http://knockoutjs.com/documentation/plugins-mapping.html#observing_only_certain_properties_using_observe –

+0

@patryk檢查我的更新 –

0

我知道這個問題是舊的更新,我Example,但我面臨同樣的問題,找到了一個簡單的解決方案,而無需使用任何插件。

假設你做了一個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方法中同樣的事情。

相關問題