2013-02-21 38 views
11

मुझे ऐसे रूपांतरण के कार्य को पूरा करने का कोई तरीका नहीं मिला क्योंकि मुझे ऑब्जेक्ट के लिए Ember.js गुण प्राप्त करने का कोई साधन नहीं मिला। Ember.keys रिटर्न केवल गुण मैं create में या get के साथ सेट और गुण Ember.extend में घोषित वहाँ दिखाई नहीं देती हैं। मैं फिलहाल मूलभूत मूल्यों (सरणी संपत्तियों के लिए जैसे [])एम्बर ऑब्जेक्ट को सादे जावास्क्रिप्ट ऑब्जेक्ट में कनवर्ट करने का कोई तरीका है?

+0

ऐसा लगता है कि JSON.stringify भी "वर्ग गुण" को अनदेखा करता है – Qrilka

उत्तर

0

स्थापित करने के लिए इस तरह के गुणों का उपयोग मैं निम्नलिखित स्निपेट के साथ इसे हल:

App.plainCopy = function (obj) { 
    if (Ember.isArray(obj)) { 
    return obj.map(App.plainCopy); 
    } else if (typeof(obj) === "object") { 
    if (App.Plainable.detect(obj)) { 
     return obj.plainCopy(); 
    } else { 
     throw new Error(Ember.String.fmt("%@ is not Plainable", [obj])); 
    } 
    } else { 
    return obj; 
    } 
} 

App.Plainable = Ember.Mixin.create({ 
    plainCopy: function() { 
    var props = Ember.keys(this); 
    var proto = this.constructor.prototype; 
    for(p in proto) { 
     if (proto.hasOwnProperty(p) && typeof(this[p])!=="function") { 
     props.push(p); 
     } 
    } 
    var copy = {}; 
    props.forEach(function(p) { 
     copy[p] = App.plainCopy(this.get(p)); 
    }, this); 
    return copy; 
    } 
}); 

यह वर्ग पदानुक्रम ऊपर जाना नहीं है और नहीं लगती है mixins में (मैं डेटा वस्तुओं जो काफी सरल रूप है के लिए उपयोग के रूप में है कि दृष्टि)

3

मैं ऊपर व्यक्ति को कुछ इसी तरह करना होगा, लेकिन मैं इसे एक छोटा सा अलग करना चाहते हैं।

Mixin

App.NativeObject = Ember.Mixin.create({ 
    toNative: function() { 
     var properties = []; 
     for (var key in this) { 
      if (jQuery.inArray(Ember.typeOf(object[key]), ['string', 'number', 'boolean']) !== -1) { 
       properties.push(key); 
      } 
     } 
     return this.getProperties(properties); 
    } 
}); 

वस्तु

तो फिर तुम सिर्फ अपने वस्तुओं में App.NativeObject mixin कि आप toNative पर चाहते हैं लागू करने की आवश्यकता:

var Object = Ember.Object.extend(App.NativeObject, { 
    name: 'Adam', 
    count: 4 
}); 

हम तो toNative है हमारे मिक्सर को लागू करने वाली सभी वस्तुओं पर विधि।

अनिवार्य jsFiddle: http://jsfiddle.net/jumUx/

+0

आपका समाधान रिकर्सिव नहीं है हालांकि – Qrilka

+0

यह रिकर्सिव बनाने के लिए इससे एक छोटा कदम है। – Wildhoney

+0

हां, लेकिन अपने बेला के इस दोराहे पर एक नज़र डालें - http://jsfiddle.net/C2Rdn/: यदि आप एक वर्ग बनाने के लिए, "NativeObject" की तरह अतिरिक्त गुण शामिल होंगे 'isDestroyed' आदि – Qrilka

-1

एक अन्य संभावित समाधान है कि अपनी आवश्यकताओं, जबकि नहीं नेस्टेड एंबर वस्तुओं के लिए पूरी तरह से पुनरावर्ती जा रहा सूट हो सकता है:

// where myEmberObject is.. an ember object 
var plainJavaScriptObject = myEmberObject.toJSON(); 

यह केवल वास्तविक गुण है कि आप परिभाषित किया और पहले कोई भी शामिल होंगे एम्बर आंतरिक। दोबारा, यहां की कमी यह है कि किसी नेस्टेड एम्बर ऑब्जेक्ट्स स्वयं को परिवर्तित नहीं किया जाएगा, लेकिन "" की शैली में स्ट्रिंग्स के रूप में दिखाई देगा।

25

यहाँ मेरी गंदा वैकल्पिक हल

var newModel = JSON.parse(JSON.stringify(model)); 
+0

नोट: इसमें फ़ंक्शन – Jaime

+0

शामिल नहीं हैं आजकल आप 'model.toJSON() 'का उपयोग कर सकते हैं। –

0

यह मैं क्या किया है और यह बहुत अच्छी तरह से काम करता है है। ध्यान दें, यह केवल तैयार हो जाना चाहिए, के रूप में एक वस्तु या कॉपी किया वस्तु में सरणी में कोई भी परिवर्तन मूल वस्तु को प्रभावित करेगा

App.BaseValidations = Ember.Object.create({ 
    toObject: function() { 
     var destination = {} 
     for (var k in this) { 
      if (this.hasOwnProperty(k) && typeof(this[k]) !== 'function') { 
       destination[k] = this[k]; 
      } 
     } 
     return destination; 
    } 
}) 
0

काफी सरल कुछ है कि मेरे लिए ठीक से काफी काम किया है:

Ember.Object.reopen({ 
    toJson: function() { 
     return JSON.parse(JSON.stringify(this)); 
    } 
}); 

ऐप लोडिंग समय पर।