2012-01-12 169 views
5

如果我有一套简单的旧的JavaScript对象(例如,从JSON返回),我如何进入Ember.js对象(或至少让绑定功能工作)?如何将嵌套的普通js对象转换为Ember.js对象?

例如,如果我有这样的对象:

var x = { 
    bar: { 
    baz: "quux" 
    } 
} 

然后我把它转换成灰烬对象:

var y = Ember.Object.create(x); 

然后设定的“baz”的值将不更新任何我拥有的视图,因为它只是一个普通的js对象,而不是一个Ember对象。

我知道我可以递归地遍历对象键,并完成Ember.Object.create,但是有没有其他方法?

回答

2

在创建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/

+0

酷,我不知道你能做到这一点。我想它有点混乱,因为那么你必须使用2种不同的存取方法 – Roland 2012-01-13 14:56:10

+0

你能详细说明你的意思吗? – ebryn 2012-01-15 08:12:53

+0

有时您可以使用标准的js赋值,即foo.bar =“a”,但有时您需要使用setPath。 (我使用ENV.USE_ACCESSORS = true,因为我不需要关心IE)。 – Roland 2012-01-15 12:21:27

0

出于某种原因,我不得不独立地在为了正确地确保所计算的作品,以限定嵌套对象(连列举的)。

对于我结束了各具特色的这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}; 
相关问题