2012-01-12 5 views
5

यदि मेरे पास सादे पुरानी जावास्क्रिप्ट ऑब्जेक्ट्स का एक नेस्टेड सेट है (उदाहरण के लिए, जेएसओएन से लौटा दिया गया है), तो मैं उन्हें Ember.js ऑब्जेक्ट्स में कैसे (या कम से कम बाइंडिंग कार्यक्षमता काम कर रहा हूं) में कैसे कर सकता हूं?नेबेड सादे जेएस ऑब्जेक्ट्स को Ember.js ऑब्जेक्ट्स में कैसे बदला जाए?

उदाहरण के लिए

, अगर मैं की तरह एक वस्तु है:

var y = Ember.Object.create(x); 

फिर "baz" का मान सेट किसी भी अपडेट नहीं करेंगे:

var x = { 
    bar: { 
    baz: "quux" 
    } 
} 

तो मैं एक एंबर वस्तु में है कि बारी मेरे पास विचार हैं, क्योंकि यह सिर्फ एक सामान्य जेएस वस्तु है, एम्बर ऑब्जेक्ट नहीं।

मुझे पता है कि मैं केवल ऑब्जेक्ट कुंजी पर फिर से जा सकता हूं, और Ember.Object.create को सभी तरह से नीचे कर सकता हूं, लेकिन क्या कोई वैकल्पिक दृष्टिकोण है?

उत्तर

2

मुझे यकीन नहीं है कि आप के मान को सेट करने का प्रयास कर रहे हैं, तो आपने Ember.Object बनाया है, लेकिन आपको यह सुनिश्चित करना चाहिए कि आप पर्यवेक्षक-जागरूक सेटर फ़ंक्शन का उपयोग करें। इस उदाहरण के लिए, मैं setPath() का उपयोग करने का सुझाव दूंगा।

उदाहरण के लिए

:

var x = { 
    bar: { 
    baz: "quux" 
    } 
}; 
var y = Ember.Object.create(x); 
y.setPath('bar.baz', 'foo'); 

jsFiddle उदाहरण, सेट करने के बाद एक दृश्य अद्यतन दिखा: http://jsfiddle.net/ebryn/kv3cU/

+0

बढ़िया, मैं आपको लगता है कि कर सकता है पता नहीं था। मुझे लगता है कि यह थोड़ा गड़बड़ है क्योंकि तब आपको 2 अलग-अलग एक्सेसर विधियों का उपयोग करना होगा – Roland

+0

क्या आप इसका मतलब बता सकते हैं? – ebryn

+0

कभी-कभी आप मानक जेएस असाइनमेंट का उपयोग कर सकते हैं, यानी foo.bar = "a", लेकिन दूसरी बार आपको setPath का उपयोग करने की आवश्यकता है। (मैं ENV.USE_ACCESSORS = सच का उपयोग कर रहा हूं, क्योंकि मुझे IE के बारे में परवाह करने की आवश्यकता नहीं है)। – Roland

0

किसी कारण मैं स्वतंत्र रूप से आदेश गणना काम करता है ठीक से सुनिश्चित करने के लिए नेस्टेड वस्तुओं को परिभाषित करने के लिए किया था के लिए (यहां तक ​​कि गणित वाले)।

है कि मैं अंत में इन 2 उपयोगिता कार्यों क्राफ्टिंग के लिए:

import EmberObject from '@ember/object'; 
import { A } from '@ember/array'; 

function fromArrayToEmberArray(array) { 
    const emberArray = A(); 
    array.forEach(function(item) { 
     if (Array.isArray(item)) { 
      emberArray.push(fromArrayToEmberArray(item)); 
     } else if (item && typeof item === 'object') { 
      emberArray.push(fromObjectToEmberObject(item)); 
     } else { 
      emberArray.push(item); 
     } 
    }); 
    return emberArray; 
} 

function fromObjectToEmberObject(pojo) { 
    const emberObject = EmberObject.create(); 

    for (const key in pojo) { 
     const keyObject = pojo[key]; 
     if (Array.isArray(keyObject)) { 
      emberObject.set(key, fromArrayToEmberArray(keyObject)) 
     } else if (keyObject && typeof keyObject === 'object') { 
      emberObject.set(key, fromObjectToEmberObject(keyObject)) 
     } else { 
      emberObject.set(key, keyObject); 
     } 
    } 

    return emberObject; 
} 

export default {fromObjectToEmberObject}; 
संबंधित मुद्दे