2013-02-21 99 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)); 
    } 
}); 

在应用加载时。

相关问题