2015-09-19 16 views
7

Giống như tiêu đề cho biết. Có cách nào để sửa đổi một giá trị quan sát mà không kích hoạt gọi lại quan sát trong Polymer?Có cách nào để sửa đổi giá trị được quan sát mà không kích hoạt gọi lại quan sát viên trong Polymer

Ví dụ

Polymer({ 
     is: 'my-component', 

     properties: { 
      aValue: { 
       type: Number, 
       value: 0, 
       observer: '_valueChanged', 
       notify: true 
      }, 
      ref: { 
       type: Object, 
       computed: '_computeRef(channel, channelNumber)' 
      } 
     }, 

     _computeRef: function(channel, channelNumber) { 

      var ref = new Firebase("/*link*/"); 
      ref.on("child_changed", function(data) { 
       this.aValue.setWithoutCallingObserver(data.val()); 
      }.bind(this)); 

      return ref; 
     }, 

     _valueChanged: function() { 
      var message = { aValue: this.aValue }; 
      if (this.ref) { 
       this.ref.set(message); 
      } 
     } 

    }); 

Đây sẽ là hữu ích vì bây giờ tôi đang trải qua tụt hậu trong các tình huống sau:

  1. Thích ứng aValue trong một ứng dụng của bên thứ ba
  2. cập nhật căn cứ hỏa lực tất cả khách hàng
  3. Gọi lại .on đặt giá trị và kích hoạt lời gọi lại của người quan sát
  4. Nguyên nhân một .set đến căn cứ hỏa lực
  5. quay trở lại 2.

Cập nhật: Vấn đề không phải là căn cứ hỏa lực liên quan. Tôi tin rằng giải pháp là kiểm soát cách cập nhật được áp dụng cho các giá trị quan sát được trong Polymer. Một phần vì thay đổi các giá trị trong cửa hàng firebase có thể được thực hiện bởi bên thứ 3 (không nhất thiết phải là web) ứng dụng quá.

+0

thể trùng lặp của [nguyên nhân căn cứ hỏa lực đồng bộ tụt hậu] (http://stackoverflow.com/questions/32529499/firebase-syncing-causes-lag) –

+0

Bạn có thể thêm biến firebaseValue mới và cập nhật nó trong hàm _computeRef của bạn. Trong hàm _valueChanged, hãy gọi ref.set chỉ khi aValue khác với firebaseValue. – Srik

Trả lời

-1

Chỉ cần thay đổi _valueChangedMethod này

_valueChanged: function(newValue, oldValue) { 
     if(newValue == oldValue) return; 
     var message = { aValue: this.aValue }; 
     if (this.ref) { 
      this.ref.set(message); 
     } 
    } 

này sẽ làm cho các quan sát viên làm công việc của mình chỉ khi giá trị thực sự thay đổi.

4

Theo hiểu biết của tôi, không có cách nào được xây dựng để đặt giá trị thuộc tính mà không kích hoạt người quan sát của nó.

Bạn không có quyền kiểm soát cách thức/khi nào với đối số của người quan sát được gọi, nhưng bạn có quyền kiểm soát cơ thể thủ tục và may mắn là bạn đang làm việc với trạng thái được chia sẻ (this).

Vì vậy, bạn có thể thay đổi hành vi của các chức năng dựa trên một lá cờ mà có thể được truy cập từ bên trong hàm, nhưng không nhất thiết phải được thông qua trong

Ví dụ:.

_valueChanged: function (new_val, old_val) { 
    if (this._observerLock) { return; } 

    var message = { aValue: this.aValue }; 
    if (this.ref) { 
     this.ref.set(message); 
    } 
    } 
}, 
... 

Sau đó, bạn có thể thực hiện phương pháp _setWithoutCallingObserver() như:

_setWithoutCallingObserver: function (value) { 
    this._observerLock = true; 
    this.aValue = value; 
    this._observerLock = false; 
} 
Các vấn đề liên quan