2012-01-12 20 views
5

Si tengo un conjunto anidado de objetos javascript antiguos y sencillos (por ejemplo, haberlos devuelto desde JSON), ¿cómo los hago en los objetos Ember.js (o al menos cómo funciona la vinculación)?Cómo convertir objetos anidados js simples en objetos Ember.js?

Por ejemplo, si tengo un objeto como:

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

Entonces convertir eso en un objeto Ember:

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

A continuación, estableciendo el valor de "baz" no va a actualizar cualquier vistas que tengo, porque es solo un objeto js normal, no un objeto Ember.

Sé que puedo ir recursivamente por las teclas de objeto, y hacer que Ember.Object.create hasta abajo, pero ¿hay un enfoque alternativo?

Respuesta

2

No estoy seguro de cómo está intentando establecer el valor de baz, después de haber creado el Ember.Object, pero debe asegurarse de utilizar una función de configuración sensible al observador. Para este ejemplo, sugeriría usar setPath().

Por ejemplo:

var x = { 
    bar: { 
    baz: "quux" 
    } 
}; 
var y = Ember.Object.create(x); 
y.setPath('bar.baz', 'foo'); 

ejemplo jsFiddle, mostrando una actualización de la vista después de ajustar: http://jsfiddle.net/ebryn/kv3cU/

+0

fresca, yo no sabía que se podía hacer eso. Supongo que es un poco más desordenado porque entonces tienes que usar 2 métodos de acceso diferentes – Roland

+0

¿Puedes dar más detalles sobre lo que quieres decir? – ebryn

+0

Algunas veces puede usar la asignación de js estándar, es decir, foo.bar = "a", pero otras veces necesita usar setPath. (Estoy usando ENV.USE_ACCESSORS = verdadero, porque no necesito preocuparme por IE). – Roland

0

Por alguna razón tuviera que definir objetos anidados de forma independiente con el fin de garantizar las obras calculados correctamente (incluso el enumerados).

Para que termino la elaboración de estas funciones de utilidad 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}; 
Cuestiones relacionadas