मुझे ऐसे रूपांतरण के कार्य को पूरा करने का कोई तरीका नहीं मिला क्योंकि मुझे ऑब्जेक्ट के लिए Ember.js गुण प्राप्त करने का कोई साधन नहीं मिला। Ember.keys
रिटर्न केवल गुण मैं create
में या get
के साथ सेट और गुण Ember.extend
में घोषित वहाँ दिखाई नहीं देती हैं। मैं फिलहाल मूलभूत मूल्यों (सरणी संपत्तियों के लिए जैसे []
)एम्बर ऑब्जेक्ट को सादे जावास्क्रिप्ट ऑब्जेक्ट में कनवर्ट करने का कोई तरीका है?
उत्तर
स्थापित करने के लिए इस तरह के गुणों का उपयोग मैं निम्नलिखित स्निपेट के साथ इसे हल:
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 में (मैं डेटा वस्तुओं जो काफी सरल रूप है के लिए उपयोग के रूप में है कि दृष्टि)
मैं ऊपर व्यक्ति को कुछ इसी तरह करना होगा, लेकिन मैं इसे एक छोटा सा अलग करना चाहते हैं।
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/
एक अन्य संभावित समाधान है कि अपनी आवश्यकताओं, जबकि नहीं नेस्टेड एंबर वस्तुओं के लिए पूरी तरह से पुनरावर्ती जा रहा सूट हो सकता है:
// where myEmberObject is.. an ember object
var plainJavaScriptObject = myEmberObject.toJSON();
यह केवल वास्तविक गुण है कि आप परिभाषित किया और पहले कोई भी शामिल होंगे एम्बर आंतरिक। दोबारा, यहां की कमी यह है कि किसी नेस्टेड एम्बर ऑब्जेक्ट्स स्वयं को परिवर्तित नहीं किया जाएगा, लेकिन "" की शैली में स्ट्रिंग्स के रूप में दिखाई देगा।
यहाँ मेरी गंदा वैकल्पिक हल
var newModel = JSON.parse(JSON.stringify(model));
नोट: इसमें फ़ंक्शन – Jaime
शामिल नहीं हैं आजकल आप 'model.toJSON() 'का उपयोग कर सकते हैं। –
यह मैं क्या किया है और यह बहुत अच्छी तरह से काम करता है है। ध्यान दें, यह केवल तैयार हो जाना चाहिए, के रूप में एक वस्तु या कॉपी किया वस्तु में सरणी में कोई भी परिवर्तन मूल वस्तु को प्रभावित करेगा
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;
}
})
काफी सरल कुछ है कि मेरे लिए ठीक से काफी काम किया है:
Ember.Object.reopen({
toJson: function() {
return JSON.parse(JSON.stringify(this));
}
});
ऐप लोडिंग समय पर।
ऐसा लगता है कि JSON.stringify भी "वर्ग गुण" को अनदेखा करता है – Qrilka