2013-07-29 11 views
5

कहो में गुण वस्तुओं बारी मैं एक ही प्रकार की वस्तुओं के इस सरणी है:कुछ observableArray नमूदार

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

और मैं इसे न केवल observableArray होना चाहते हैं, लेकिन यह भी मैं ही, कहते हैं, स्थिति संपत्ति का निरीक्षण करना चाहते हैं प्रत्येक वस्तु का।

कल्पना कीजिए कि वस्तुओं को स्वयं जोड़ा या हटाया जा सकता है। उन वस्तुओं में से किसी भी नाम का नाम बदलने वाला नहीं है, इसलिए मुझे वास्तव में नाम का पालन करने की आवश्यकता नहीं है लेकिन प्रत्येक ऑब्जेक्ट की स्थिति बदल सकती है, इस प्रकार इसे देखने योग्य बनाने के लिए यह अच्छा होगा।

क्या कुछ ठंडा हैक सिंटैक्स के साथ इसे नॉकआउट यूटिलिटीज के साथ मैप करना संभव है या क्या मुझे या तो प्रत्येक ऑब्जेक्ट के माध्यम से फिर से भरना होगा और इसकी स्थिति संपत्ति को अवलोकन में मैप करना होगा या पूरे सरणी और इसकी ऑब्जेक्ट गुणों को देखने योग्य होगा?

उत्तर

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

अब वीएम एक observableArray है कि वस्तुओं का दर्जा एक obsevable है और नाम एक नियमित रूप से संपत्ति है, जिसमें शामिल हैं।

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 (डेटा, {}) है;' var vm जैसा ही है; ko.mapping.fromJS (डेटा, {}, vm); ' – patryk

+0

पहला कॉल प्रारंभिक कॉल के लिए है, और दूसरा अद्यतन के लिए है। जब आप सेवर से "ताजा" डेटा प्राप्त करते हैं तो "मतलब" अपडेट करें और आपको मौजूदा व्यूमोडेल को अपडेट करने की आवश्यकता है। – Damien

1

मैं उपयोग copy

ताकि आप गुण आप observables नहीं होना चाहता हूँ की सरणी प्रदान कर सकते हैं सुझाव देते हैं।

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 के लिए एक अद्यतन है, लेकिन मैं एक ही समस्या का सामना करना पड़ा है और किसी भी प्लग-इन का उपयोग किए बिना एक सरल उपाय मिल गया।

मान लें कि आप एक अनुरोध प्राप्त करते हैं, और पदों की एक श्रृंखला वापस प्राप्त करते हैं।प्रत्येक प्रविष्टि के लिए, आपके पास "पसंदीदा" नामक एक संपत्ति होती है, जो एक बुलियन है जो इंगित करता है कि पोस्ट उपयोगकर्ता द्वारा पसंद किया गया है या नहीं, और आप इस संपत्ति को देखने योग्य बनाना चाहते हैं ताकि आप कुछ ऐसे कार्य में काम कर सकें जो इसकी स्थिति बदलती है।

आप निम्न कर सकता है:

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 विधि के अंदर ही बात कर बदल सकते हैं।

संबंधित मुद्दे