2013-02-21 82 views
11

我找不到任何方法來完成這種轉換的任務,因爲我找不到任何方法獲取對象的Ember.js屬性。 Ember.keys僅返回我在createget中設置的屬性,並且在Ember.extend中聲明的屬性不會顯示在那裏。我用這樣的屬性來設置默認值(例如[]數組屬性)有沒有什麼方法可以將Ember對象轉換爲純javascript對象?

+0

它看起來像JSON.stringify也忽略「類屬性」 – Qrilka 2013-02-21 11:58:27

回答

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

我會做類似於上面的人的事情,但我會做一點不同的事情。

密新

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混入,你會喜歡toNative上:

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

然後我們有toNative方法實現我們的混合的所有對象。

強制性的jsfiddle:http://jsfiddle.net/jumUx/

+0

你的解決方案不是遞歸的雖然 – Qrilka 2013-02-28 12:47:28

+0

但是,這是一個小的步驟,使它遞歸。 – Wildhoney 2013-03-05 18:08:04

+0

是的,但看看你的小提琴的這個叉 - http://jsfiddle.net/C2Rdn/:如果你創建一個類,「NativeObject」將包括像'isDestroyed'等額外的屬性等。 – Qrilka 2013-03-06 09:13:59

-1

可滿足您的需求,而不是嵌套灰燼對象完全遞歸的另一種可能的解決方案:

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

這將只包含您定義和實際性能沒有灰燼內部。同樣,這裏的缺點是任何嵌套的Ember對象本身都不會被轉換,而是會以「」形式顯示爲字符串。

25

這裏是我的髒解決辦法

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

注意:這不包括函數 – Jaime 2014-03-18 00:38:57

+0

現在你可以使用'model.toJSON()'。 – 2018-01-29 15:20:44

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

在應用加載時。

相關問題