我找不到任何方法来完成这样的转换任务,因为我找不到任何方法来获取该对象的Ember.js属性。Ember.keys只返回我在create中设置的属性或使用get设置的属性,而在Ember.extend中声明的属性不会显示在那里。我使用这样的属性来设置默认值(例如,[]用于数组属性)
Ember.keys
create
get
Ember.extend
[]
r7xajy2e1#
下面是我的肮脏解决方案
var newModel = JSON.parse(JSON.stringify(model));
vsnjm48y2#
我会做一些类似于上面的人,但我会做一点不同。
迷心
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:
App.NativeObject
toNative
var Object = Ember.Object.extend(App.NativeObject, { name: 'Adam', count: 4 });
然后,我们在所有实现mixin的对象上使用toNative方法。强制jsFiddle:http://jsfiddle.net/jumUx/
hfwmuf9z3#
如果你的对象是ember-data模型的子类,注意you can use the toJSON method否则你可以用途:
toJSON
JSON.parse(JSON.stringify(emberObj))
获取支持本机json序列化的任何值(即,不是函数/方法)
u7up0aaq4#
这对我很有效:myModel.toJSON({includeId: true})我用的是ember3号。
myModel.toJSON({includeId: true})
pxq42qpu5#
这就是我所做的,它运行得很好。注意,这应该是准备好的,因为任何对复制对象中的对象或数组的更改都会影响到原始对象
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; } })
daolsyd06#
对我来说很简单的事情就是:
Ember.Object.reopen({ toJson: function() { return JSON.parse(JSON.stringify(this)); } });
在应用程序加载时。
p5fdfcr17#
现在我用下面的代码段来解决这个问题:
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; } });
它不向上进入类层次结构,也不查看mixin(正如我对数据对象所使用的,从这个Angular 来看,数据对象非常简单)
polhcujo8#
对于modern(3.17)ember,我使用了myEmberObject.getProperties('id', 'name', 'foo', 'bar')它会产生一般对象。
myEmberObject.getProperties('id', 'name', 'foo', 'bar')
juud5qan9#
另一种可能的解决方案,可以满足您的需要,而不是完全递归嵌套的Ember对象:
// where myEmberObject is.. an ember object var plainJavaScriptObject = myEmberObject.toJSON();
这将只包含您定义的实际属性,而不包含Ember内部属性。同样,这里的缺点是任何嵌套的Ember对象本身不会被转换,而是以“"样式的字符串显示。
9条答案
按热度按时间r7xajy2e1#
下面是我的肮脏解决方案
vsnjm48y2#
我会做一些类似于上面的人,但我会做一点不同。
迷心
对象
然后你只需要在你的对象中实现
App.NativeObject
mixin,你想在这些对象上实现toNative
:然后,我们在所有实现mixin的对象上使用
toNative
方法。强制jsFiddle:http://jsfiddle.net/jumUx/
hfwmuf9z3#
如果你的对象是ember-data模型的子类,注意you can use the
toJSON
method否则你可以用途:获取支持本机json序列化的任何值(即,不是函数/方法)
u7up0aaq4#
这对我很有效:
myModel.toJSON({includeId: true})
我用的是ember3号。
pxq42qpu5#
这就是我所做的,它运行得很好。注意,这应该是准备好的,因为任何对复制对象中的对象或数组的更改都会影响到原始对象
daolsyd06#
对我来说很简单的事情就是:
在应用程序加载时。
p5fdfcr17#
现在我用下面的代码段来解决这个问题:
它不向上进入类层次结构,也不查看mixin(正如我对数据对象所使用的,从这个Angular 来看,数据对象非常简单)
polhcujo8#
对于modern(3.17)ember,我使用了
myEmberObject.getProperties('id', 'name', 'foo', 'bar')
它会产生一般对象。
juud5qan9#
另一种可能的解决方案,可以满足您的需要,而不是完全递归嵌套的Ember对象:
这将只包含您定义的实际属性,而不包含Ember内部属性。同样,这里的缺点是任何嵌套的Ember对象本身不会被转换,而是以“"样式的字符串显示。