2013-02-21 7 views
11

オブジェクトのEmber.jsプロパティを取得する手段が見つからないため、このような変換作業を行う方法が見つかりませんでした。 Ember.keysは、createに設定したプロパティまたはgetで設定したプロパティのみを返し、Ember.extendで宣言されたプロパティは表示されません。Emberオブジェクトをプレーンなjavascriptオブジェクトに変換する方法はありますか?

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

それはクラス階層まで行かないと見ていません:私は、私は次のコードでそれを解決するため現時点ではデフォルト値(配列プロパティ用など[]

+0

JSON.stringifyも "クラスのプロパティ"を無視しているようです – Qrilka

答えて

0

を設定するには、このような性質を利用しますミックスインに(私はその視点からかなり単純な形式のデータオブジェクトを使用しています)

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

オブジェクト

次に、あなたがちょうどあなたが上toNativeをしたいと思い、あなたのオブジェクトでApp.NativeObjectミックスインを実装する必要があります。私たちは、その後、

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

を持っているのはtoNative私たちのmixinを実装するすべてのオブジェクトのメソッド。

必須jsFiddle:ネストされたエンバーオブジェクトの完全再帰的ではないが、あなたのニーズに合わせてhttp://jsfiddle.net/jumUx/

+0

あなたの解は再帰的ではありませんが、 – Qrilka

+0

それは再帰的にすることから少しです。 – Wildhoney

+0

しかし、あなたのフィドルのこのフォークを見てください。http://jsfiddle.net/C2Rdn/:クラスを作成すると、 "NativeObject"にはisDestroyedなどの追加プロパティが含まれます。 – Qrilka

-1

もう1つの可能な解決策:

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

これだけあなたが定義した実際のプロパティを含めるとなしますEmberの内部構造。繰り返しになりますが、ここでの欠点は、ネストされたEmberオブジェクト自体は変換されず、 ""のスタイルで文字列として表示されることです。ここで

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

アプリの読み込み時に

関連する問題