2012-01-12 5 views
5

Nếu tôi có một tập hợp lồng nhau của các đối tượng javascript cũ đơn giản (ví dụ, đã được trả về từ JSON), làm thế nào để chúng vào các đối tượng Ember.js (hoặc ít nhất là nhận được chức năng liên kết làm việc)?Làm thế nào để biến các đối tượng js lồng nhau thành các đối tượng Ember.js?

Ví dụ, nếu tôi có một đối tượng như:

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

Sau đó, tôi biến chúng thành một đối tượng Ember:

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

Sau đó, thiết lập giá trị của "baz" sẽ không cập nhật bất kỳ tôi có, bởi vì nó chỉ là một đối tượng js bình thường, không phải là một đối tượng Ember.

Tôi biết tôi chỉ có thể đệ quy đi qua các khóa đối tượng, và làm Ember.Object.create tất cả các con đường xuống, nhưng là có một cách tiếp cận thay thế?

Trả lời

2

Tôi không chắc chắn cách bạn đang cố gắng đặt giá trị baz, sau khi bạn đã tạo Ember.Object, nhưng bạn nên đảm bảo bạn sử dụng chức năng thiết lập nhận biết người quan sát. Đối với ví dụ này, tôi khuyên bạn nên sử dụng setPath().

Ví dụ:

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

dụ jsFiddle, cho thấy một bản cập nhật quan điểm sau khi cài đặt: http://jsfiddle.net/ebryn/kv3cU/

+0

mát, tôi không biết bạn có thể làm điều đó. Tôi đoán nó là một chút lộn xộn bởi vì sau đó bạn phải sử dụng 2 phương pháp truy cập khác nhau – Roland

+0

Bạn có thể xây dựng trên những gì bạn có nghĩa là? – ebryn

+0

Đôi khi bạn có thể sử dụng gán j tiêu chuẩn, tức là foo.bar = "a", nhưng các lần khác bạn cần sử dụng setPath. (Tôi đang sử dụng ENV.USE_ACCESSORS = true, vì tôi không cần quan tâm đến IE). – Roland

0

Đối với một số lý do tôi phải xác định đối tượng lồng nhau một cách độc lập để đảm bảo các công trình tính đúng cách (ngay cả những những người được liệt kê).

Cho rằng tôi kết thúc việc tạo các chức năng tiện ích 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};