polymer - 有没有办法在不触发 Polymer 中的观察者回调的情况下修改观察值

标签 polymer object.observe

正如标题所说。有没有办法在不触发 Polymer 中的观察者回调的情况下修改观察值?

例如

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);
            }
        }

    });

这将很有用,因为现在我在以下情况下遇到滞后:
  • 适配 aValue在第三方应用程序中
  • Firebase 更新所有客户端
  • .on 回调设置值并触发观察者回调
  • 导致 .set 为 firebase
  • 返回 2。

  • 更新:该问题与 firebase 无关。我相信解决方案是控制如何将更新应用于 Polymer 中的观察值。部分原因是因为第 3 方(不一定是 Web)应用程序也可以更改 firebase 存储中的值。

    最佳答案

    据我所知,没有内置的方法来设置属性值而不触发它的观察者。

    您无法控制如何/何时/使用什么参数调用观察者,但您可以控制过程主体,幸运的是,您正在使用共享状态( this )。

    因此,您可以根据可以从函数内部访问但不必传入的标志来修改函数的行为。

    例如:

    _valueChanged: function (new_val, old_val) {
       if (this._observerLock) { return; }
    
       var message = { aValue: this.aValue };
         if (this.ref) {
           this.ref.set(message);
         }
       }
     }, 
    ...
    

    然后,您可以实现 _setWithoutCallingObserver()方法如:
    _setWithoutCallingObserver: function (value) {
      this._observerLock = true;
      this.aValue = value;
      this._observerLock = false;
    }
    

    关于polymer - 有没有办法在不触发 Polymer 中的观察者回调的情况下修改观察值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32669583/

    相关文章:

    javascript - 对象.观察顺序

    google-chrome - Object.observe 在 chrome 50 中移除

    javascript - 如何根据元素的属性将纸质列表框中的某些元素设为一种颜色,将其他元素设为另一种颜色?

    javascript - 在没有jquery的情况下单击Polymer js展开div

    javascript - 如何使用 Polymer 1.0 中的行为来模仿 Polymer 0.5 中的扩展

    javascript - Object.observe 和 Object.watch 有什么区别

    javascript - 观察定义属性的值时超出最大堆栈

    css - 如何自定义预定义元素

    google-app-engine - Polymer 和谷歌云端点 Go 后端