如何将嵌套的普通js对象转换为Ember.js对象?
问题描述:
如果我有一套简单的旧的JavaScript对象(例如,从JSON返回),我如何进入Ember.js对象(或至少让绑定功能工作)?如何将嵌套的普通js对象转换为Ember.js对象?
例如,如果我有这样的对象:
var x = {
bar: {
baz: "quux"
}
}
然后我把它转换成灰烬对象:
var y = Ember.Object.create(x);
然后设定的“baz”的值将不更新任何我拥有的视图,因为它只是一个普通的js对象,而不是一个Ember对象。
我知道我可以递归地遍历对象键,并完成Ember.Object.create,但是有没有其他方法?
答
在创建Ember.Object
后,我不确定您是如何尝试设置值baz
的,但您应确保使用观察者感知的setter函数。对于这个例子,我建议使用setPath()
。
例如:
var x = {
bar: {
baz: "quux"
}
};
var y = Ember.Object.create(x);
y.setPath('bar.baz', 'foo');
的jsfiddle例如,示出设置后的图更新:http://jsfiddle.net/ebryn/kv3cU/
答
出于某种原因,我不得不独立地在为了正确地确保所计算的作品,以限定嵌套对象(连列举的)。
对于我结束了各具特色的这2个实用功能:
import EmberObject from '@ember/object';
import { A } from '@ember/array';
function fromArrayToEmberArray(array) {
const emberArray = A();
array.forEach(function(item) {
if (Array.isArray(item)) {
emberArray.push(fromArrayToEmberArray(item));
} else if (item && typeof item === 'object') {
emberArray.push(fromObjectToEmberObject(item));
} else {
emberArray.push(item);
}
});
return emberArray;
}
function fromObjectToEmberObject(pojo) {
const emberObject = EmberObject.create();
for (const key in pojo) {
const keyObject = pojo[key];
if (Array.isArray(keyObject)) {
emberObject.set(key, fromArrayToEmberArray(keyObject))
} else if (keyObject && typeof keyObject === 'object') {
emberObject.set(key, fromObjectToEmberObject(keyObject))
} else {
emberObject.set(key, keyObject);
}
}
return emberObject;
}
export default {fromObjectToEmberObject};
酷,我不知道你能做到这一点。我想它有点混乱,因为那么你必须使用2种不同的存取方法 – Roland 2012-01-13 14:56:10
你能详细说明你的意思吗? – ebryn 2012-01-15 08:12:53
有时您可以使用标准的js赋值,即foo.bar =“a”,但有时您需要使用setPath。 (我使用ENV.USE_ACCESSORS = true,因为我不需要关心IE)。 – Roland 2012-01-15 12:21:27