2013-09-05 23 views
6

Tại sao mẫu của tôi không được cập nhật khi tôi thay đổi thuộc tính hiển thị? Các trạng thái documentation cho biết rằng {{each}} là sự ràng buộc, nhưng rõ ràng là có điều gì đó mà tôi không biết.Ember, mẫu của tôi không cập nhật về thay đổi thuộc tính

Giống như mọi thứ trong Handlebars, trình trợ giúp {{#each}} là sự ràng buộc. Nếu ứng dụng của bạn thêm mục mới vào mảng hoặc xóa một mục, DOM sẽ được cập nhật mà không cần phải viết bất kỳ mã nào.

Dưới đây là bộ điều khiển của tôi

App.MaintemplateController = Ember.Controller.extend({ 
    alist: ['foo', "bar"],   
    actions : { 
    addel: function(){ 
      this.alist.push('xpto'); 
      console.log(this.alist); 
    } 
    } 
}); 

Trong mẫu của tôi, tôi có đoạn mã sau.

{{#each alist}} 
    <li>{{.}}</li> 
{{/each}} 
<button {{action 'addel'}}>Add element</button> 

Dữ liệu được hiển thị chính xác và khi tôi nhấp vào nút, nó thêm phần tử vào thuộc tính, nhưng mẫu không làm mới. Tại sao? Làm thế nào để giữ nó đồng bộ với dữ liệu của tôi?

Trả lời

15

Mẫu của bạn hiện không cập nhật vì bạn đang sử dụng javascript vanilla thuần túy .push thay vì bằng cách cung cấp bởi ember cung cấp .pushObject.removeObject tương ứng. Ember theo mặc định mở rộng nguyên mẫu mảng để làm cho nó phát độc đáo trong môi trường nhận thức ràng buộc.

Vì vậy, để thực hiện cập nhật mẫu của bạn, bạn nên làm:

App.MaintemplateController = Ember.Controller.extend({ 
    alist: ['foo', "bar"],   
    actions : { 
    addel: function(){ 
     this.get('alist').pushObject('xpto'); 
     console.log(this.get('alist')); 
    } 
    } 
}); 

Điểm mấu quan trọng ở đây là this.get('alist').pushObject('xpto'); Hơn nữa, bạn nên luôn luôn sử dụng .get().set() để truy cập các đối tượng trong ember nếu không thì cơ chế ràng buộc sẽ không được nhận thức của thay đổi được thực hiện cho đối tượng.

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

+0

Điều này trả lời câu hỏi của tôi và giải quyết vấn đề này. Tuy nhiên tôi đã hy vọng có một giải pháp mà sẽ làm việc bất kể kiểu dữ liệu. Tôi phải làm gì nếu thay vì một mảng đơn giản, tôi có một đối tượng phức tạp và cần phải sử dụng gán để cập nhật một số thuộc tính bên trong của nó? – Pico

+1

@ Pico, rất vui vì tôi có thể trợ giúp. Vâng trong trường hợp của một đối tượng phức tạp hơn bạn đi bộ xuống cây đối tượng và thiết lập các thuộc tính của nó, như: 'this.get ('complexObject.childOne.childTwo'). Set ('name', 'foo');' có ý nghĩa? – intuitivepixel

+0

Vâng, cảm ơn bạn. – Pico

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