2013-06-21 15 views
5

Cập nhật mảng Ember JS không phản ánh trong dạng xem.Ember JS, cập nhật mảng không phản ánh trong giao diện

khiển

App.MyController = Ember.ArrayController.extend({ 
    results: [], 
    init: function(){ 
    _this = this 
    App.MyModel.find({}).then(function(contents) { 
     obj1 = contents.objectAt(0) 
     obj1.get('data').hasMany.results.forEach(function(item){ 
      _this.results.push(item) 
     }); 
    }) 
    //rest of the code 
    } 
}) 

Template

{{#each results}} 
    // show items of reults. 
{{/each}} 

Đây là đoạn mã mà tôi đang lấy dữ liệu từ máy chủ, và sau khi tải của nó, tôi đang đẩy nó vào mảng kết quả. Việc tải dữ liệu từ máy chủ này mất một chút thời gian, vì vậy bản đồ mẫu trên mảng kết quả trống. Lý tưởng nhất, mảng kết quả nên cập nhật những thứ trong mẫu nhưng một cách hợp lý nó không nên.

Có cơ thể nào biết tôi đang thiếu ở đâu không? hoặc làm sai.

Xin cảm ơn trước.

Trả lời

15

Để các ràng buộc hoạt động, bạn phải sử dụng pushObject thay vì push. Thông tin

App.MyController = Ember.ArrayController.extend({ 
    results: [], 
    init: function(){ 
    _this = this; 
    App.MyModel.find({}).then(function(contents) { 
     obj1 = contents.objectAt(0); 
     obj1.get('data').hasMany.results.forEach(function(item){ 
     _this.results.pushObject(item) 
     }); 
    }) 
    //rest of the code 
    } 
}); 

Fore thêm về mảng ember pushObject xin vui lòng xem here.

Hy vọng điều đó sẽ hữu ích.

+0

Bạn vừa lưu ngày của tôi. Cảm ơn bạn. –

+0

Lưu ý rằng mảng của bạn cần phải là 'Ember.NativeArray', cũng là một' MutableArray'. Nếu bạn đang có ember mở rộng nguyên mẫu js Array bản địa, thì mảng bản địa js sẽ có một hàm '.pushObject (thing)'. Nếu bạn không mở rộng nguyên mẫu gốc, bạn sẽ cần sử dụng 'Ember.A ([])'. [Tìm hiểu thêm về Ember.A()] (https://emberjs.com/api/ember/3.0/functions/@ember%2Farray/A) –

0

Tôi gặp sự cố tương tự. Vấn đề là Ember không được thông báo về sự thay đổi trong mảng. Trong trường hợp này, bạn có một hàm Ember đặc biệt (pushObject) thay thế Push tiêu chuẩn và cũng thông báo cho khuôn khổ của sự thay đổi. Nhưng trong các trường hợp khác (ví dụ Array.splice) bạn không có chức năng như vậy, vì vậy bạn cần phải thông báo cho khung công tác theo cách thủ công. Bạn có thể làm điều này với:

this.notifyPropertyChange('array');