2015-06-04 18 views
8

Tôi đang sử dụng thuộc tính được tính là items cho số dom-repeat.Thuộc tính tính toán không được tính toán lại khi phụ thuộc mảng bị đột biến

<template is="dom-repeat" items="{{double(values)}}"> 
    <span>{{item}}</span> 
</template> 

Khi phụ thuộc của nó values thay đổi, thuộc tính không được tính toán lại.

addValue: function() { 
    this.push('values', this.values.length+1); 
    this.async(this.addValue, 1000); 
}, 

Nếu, thay vì đột biến values, tôi đặt nó vào một mảng mới, nó làm việc:

this.set('values', this.values.concat(this.values.length+1)) 

Đây có phải là một lỗi hoặc hành vi mong đợi?

Demo: http://plnkr.co/edit/SmAHKMHhSPWgmBhBBzAv?p=preview

Trả lời

10

Tôi đã nói chuyện với Scott Miles, một thành viên của các đội phía sau Polymer, và tôi đã trở lại này:

Để cho các tài sản tính để ràng buộc đúng cách, bạn phải sử dụng [[double(values.*)]].

Các tham số truyền cho hàm double của bạn sẽ là đối tượng có thuộc tính path, value, và base, cũng giống như trong con đường quan sát.

  • path sẽ đề cập đến một chuỗi con đường mà xác định nếu length hoặc splices đã được cập nhật trong mảng,
  • value sẽ là giá trị của length hoặc splices, và
  • base sẽ đề cập đến mảng của bạn.

Ví dụ:

<template is="dom-repeat" items="[[double(values.*)]]"> 
    <span>[[item]]</span> 
</template> 

<script> 
    ... 
    double: function(e) { 
    return e.base.map(function(n) { return n*2; }); 
    } 

Documents: https://www.polymer-project.org/1.0/docs/devguide/properties.html#array-observation

Demo: http://plnkr.co/edit/Idrz5XvLn9SZ35iR8pGT?p=preview

Mẫu dom-repeat hy vọng sẽ được làm việc với một bộ sưu tập, và do đó khi bạn ràng buộc nó để values trực tiếp, nó biết để giữ các tab trên các mục trong values.

tính Điện Toán không có bất kỳ sự mong đợi như vậy, và vì vậy [[double(values)]] không hoạt động trong trường hợp này bởi vì nó sẽ chỉ cập nhật khi values tham khảo bản thân thay đổi, không khi các mục trong sự thay đổi mảng. Sử dụng values.* cho phép Polymer biết rằng nó sẽ cập nhật liên kết thuộc tính được tính toán khi nội dung của mảng bị biến đổi.


tôi sẽ không đăng bài này ở đây thay cho Scott nếu không muốn nói cho

sjmiles: @vartan: OTOH, nếu bạn có thể ghi lại những gì bạn đã học được, nó sẽ giúp tôi, thời gian là ít nhất tôi tài nguyên đàn hồi

+1

Cũng lưu ý rằng chức năng của thuộc tính được tính không được chuyển trực tiếp vào mảng, nhưng dưới dạng thuộc tính có tên 'cơ sở'. Vì vậy, 'hàm (giá trị) {...}' trở thành 'hàm (thông tin) {var values ​​= info.base; ...} ' –

+0

@TrevorDixon Goodness, tôi đã bỏ qua đề cập đến điều đó! Big whoops. Tôi đã thêm tất cả các chi tiết bổ sung trong :) Cảm ơn bạn đã chú ý! –

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