2013-02-21 48 views
11

Tôi không thể tìm thấy bất kỳ cách nào để thực hiện nhiệm vụ chuyển đổi như vậy vì tôi không thể tìm thấy bất kỳ phương tiện nào để nhận các thuộc tính Ember.js cho đối tượng. Ember.keys chỉ trả lại các thuộc tính tôi đã đặt trong create hoặc với get và các thuộc tính được khai báo trong Ember.extend không hiển thị ở đó. Tôi sử dụng tài sản đó để thiết lập giá trị mặc định (ví dụ [] đối với tài sản mảng)Có cách nào để chuyển đổi đối tượng Ember thành đối tượng javascript đơn giản không?

+0

Dường như JSON.stringify cũng bỏ qua "thuộc tính lớp" – Qrilka

Trả lời

0

Tại thời điểm này tôi giải quyết nó với đoạn mã sau:

App.plainCopy = function (obj) { 
    if (Ember.isArray(obj)) { 
    return obj.map(App.plainCopy); 
    } else if (typeof(obj) === "object") { 
    if (App.Plainable.detect(obj)) { 
     return obj.plainCopy(); 
    } else { 
     throw new Error(Ember.String.fmt("%@ is not Plainable", [obj])); 
    } 
    } else { 
    return obj; 
    } 
} 

App.Plainable = Ember.Mixin.create({ 
    plainCopy: function() { 
    var props = Ember.keys(this); 
    var proto = this.constructor.prototype; 
    for(p in proto) { 
     if (proto.hasOwnProperty(p) && typeof(this[p])!=="function") { 
     props.push(p); 
     } 
    } 
    var copy = {}; 
    props.forEach(function(p) { 
     copy[p] = App.plainCopy(this.get(p)); 
    }, this); 
    return copy; 
    } 
}); 

Nó không đi lên hệ thống phân cấp lớp và không giống vào mixin (như tôi sử dụng cho các đối tượng dữ liệu có hình thức khá đơn giản mà quan điểm)

3

Tôi sẽ làm điều gì đó tương tự như người ở trên, nhưng tôi sẽ làm điều đó một chút khác nhau.

Mixin

App.NativeObject = Ember.Mixin.create({ 
    toNative: function() { 
     var properties = []; 
     for (var key in this) { 
      if (jQuery.inArray(Ember.typeOf(object[key]), ['string', 'number', 'boolean']) !== -1) { 
       properties.push(key); 
      } 
     } 
     return this.getProperties(properties); 
    } 
}); 

Object

Sau đó, bạn chỉ cần thực hiện các App.NativeObject mixin trong đối tượng của bạn mà bạn muốn toNative trên:

var Object = Ember.Object.extend(App.NativeObject, { 
    name: 'Adam', 
    count: 4 
}); 

Sau đó chúng tôi có toNative phương pháp trên tất cả các đối tượng thực hiện mixin của chúng tôi.

buộc jsFiddle: http://jsfiddle.net/jumUx/

+0

giải pháp của bạn không đệ quy mặc dù – Qrilka

+0

Tuy nhiên, đó là một bước nhỏ từ đó để làm cho nó trở nên đệ quy. – Wildhoney

+0

yep, nhưng hãy nhìn vào ngã ba này của fiddle của bạn - http://jsfiddle.net/C2Rdn/: nếu bạn tạo một lớp, "NativeObject" sẽ bao gồm các thuộc tính bổ sung như 'isDestroyed' vv – Qrilka

-1

Một giải pháp khả thi có thể phù hợp với nhu cầu của bạn trong khi không phải là hoàn toàn đệ quy cho các đối tượng Ember lồng nhau:

// where myEmberObject is.. an ember object 
var plainJavaScriptObject = myEmberObject.toJSON(); 

này sẽ chỉ bao gồm các thuộc tính thực tế mà bạn đã xác định và không Ember internals. Một lần nữa, nhược điểm ở đây là bất kỳ đối tượng Ember lồng nhau nào cũng sẽ không được chuyển đổi nhưng sẽ xuất hiện dưới dạng Strings theo kiểu "".

25

Đây là workaround bẩn của tôi

var newModel = JSON.parse(JSON.stringify(model)); 
+0

lưu ý: điều này không bao gồm các chức năng – Jaime

+0

Ngày nay bạn chỉ có thể sử dụng 'model.toJSON()'. –

0

Đây là những gì tôi đã làm và nó hoạt động khá tốt. Lưu ý, điều này sẽ sẵn sàng chỉ, như bất kỳ thay đổi đến một đối tượng hoặc mảng trong đối tượng sao chép sẽ ảnh hưởng đến các đối tượng gốc

App.BaseValidations = Ember.Object.create({ 
    toObject: function() { 
     var destination = {} 
     for (var k in this) { 
      if (this.hasOwnProperty(k) && typeof(this[k]) !== 'function') { 
       destination[k] = this[k]; 
      } 
     } 
     return destination; 
    } 
}) 
0

một cái gì đó khá đơn giản mà làm việc đúng đủ đối với tôi là:

Ember.Object.reopen({ 
    toJson: function() { 
     return JSON.parse(JSON.stringify(this)); 
    } 
}); 

tại thời điểm tải ứng dụng.

Các vấn đề liên quan