2012-02-08 36 views
16

Tôi có một mô hình được xây dựng từ một đối tượng JSON.Làm cách nào để quan sát * tất cả * thay đổi thuộc tính trên một đối tượng mô hình?

// extend the json model to get all props 
App.Model = Ember.Object.extend(window.jsonModel); 

Tôi muốn tự động lưu mô hình khi mọi thứ được cập nhật. Có cách nào tôi có thể thêm người quan sát vào toàn bộ mô hình không?

EDIT: // thêm các giải pháp tôi đang đi

Để bây giờ tôi làm:

// XXX Can't be right 
for (var prop in window.jsonModel) { 
    if (window.jsonModel.hasOwnProperty(prop)) { 
     App.model.addObserver(prop, scheduleSave); 
    } 
} 

Đây là một hình thức lớn, có nghĩa là tôi thêm tấn nhà quan sát - đó dường như không hiệu quả .

Điểm dừng Firebug tại Ember.sendEvent() cho thấy rằng có các sự kiện được gọi là App.model.lastName:change đang được gửi. Tôi có thể hack trong một đánh chặn ở đó, nhưng đã hy vọng một cách chính thức.

Trả lời

2

Từ bài viết:

autosave: function(){ 
    this.save(); 
}.observes('attributes'), 


save: function(){ 
    var self = this, 
    url = this.get('isNew') ? '/todos.json' : '/todos/'+this.get('id')+'.json', 
    method = this.get('isNew') ? 'POST' : 'PUT'; 

    $.ajax(url, { 
    type: 'POST', 
    // _method is used by Rails to spoof HTTP methods not supported by all browsers 
    data: { todo: this.get('attributes'), _method: method }, 
    // Sometimes Rails returns an empty string that blows up as JSON 
    dataType: 'text', 
    success: function(data, response) { 
     data = $.trim(data); 
     if (data) { data = JSON.parse(data); } 
     if (self.get('isNew')) { self.set('id', data['todo']['id']); } 
    } 
    }); 
}, 

isNew: function(){ 
    return !this.get('id'); 
}.property('id').cacheable(), 
+0

Vấn đề là trong bất động sản tính 'attributes' mà phải bị ràng buộc rõ ràng để * mỗi * bất động sản trong mô hình của tôi (nhìn thấy trong bài viết gốc) - đây là những gì tôi không muốn. –

2

tôi đã có yêu cầu tương tự, và không tìm thấy một câu trả lời thích hợp, tôi thực hiện một.

Hãy thử điều này: https://gist.github.com/4279559

Về cơ bản, đối tượng bạn muốn quan sát tất cả các thuộc tính của PHẢI là một hỗn hợp của Ember.Stalkable. Bạn có thể quan sát các thuộc tính của đối tượng đó là 'item. @ Properties' (hoặc, nếu bạn trực tiếp quan sát trực tiếp trên Stalkable, '@properties' hoạt động. "@ownProperties", "@initProperties" và "@prototypeProperties" cũng hoạt động và tham chiếu đến (các thuộc tính duy nhất cho một cá thể và không được định nghĩa trên bất kỳ mẫu thử nghiệm nào), (các thuộc tính được định nghĩa như là một phần của lời gọi create()) và (các thuộc tính được định nghĩa là một phần của định nghĩa lớp)

trong nhà quan sát của bạn, nếu bạn muốn biết những gì thuộc tính thay đổi và gọi xử lý, tài sản "modifiedProperties", một mảng, sẽ có sẵn với tên của các thuộc tính thay đổi.

8

bạn có thể liên kết với isDirty bất động sản của lớp con của DS.Model. isDirty thay đổi từ false đến đúng khi một trong các thuộc tính mô hình thay đổi. Nó sẽ không phục vụ tốt cho tất cả các trường hợp vì nó chỉ thay đổi một lần cho đến khi đặt lại hoặc cam kết, nhưng đối với trường hợp của bạn -

Tôi muốn tự động lưu mô hình khi mọi thứ được cập nhật. Có cách nào tôi có thể thêm người quan sát vào toàn bộ mô hình không?

nó có thể hoạt động tốt.

+1

Nếu bạn không sử dụng Dữ liệu Ember thì sao? –

0

Tôi tạo ra một tài sản ảo _anyProperty có thể được sử dụng như một chìa khóa phụ thuộc:

import Ember from 'ember'; 

Ember.Object.reopen({ 

    // Virtual property for dependencies on any property changing 
    _anyPropertyName: '_anyProperty', 
    _anyProperty: null, 

    propertyWillChange(keyName) { 
    if (keyName !== this._anyPropertyName) { 
     this._super(this._anyPropertyName); 
    } 
    return this._super(keyName); 
    }, 

    propertyDidChange(keyName) { 
    if (keyName !== this._anyPropertyName) { 
     this._super(this._anyPropertyName); 
    } 
    return this._super(keyName); 
    } 

}); 
Các vấn đề liên quan