2012-01-12 129 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}; 
相關問題