【问题标题】:Is there a way to modify a observed valued without triggering the observer callback in Polymer有没有办法在不触发 Polymer 中的观察者回调的情况下修改观察值
【发布时间】:2015-12-16 15:21:21
【问题描述】:

正如标题所说。有没有办法在不触发 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);
            }
        }

    });

这很有用,因为现在我在以下情况下遇到了延迟:

  1. 在第三方应用中适配aValue
  2. Firebase 更新所有客户端
  3. .on 回调设置值并触发观察者回调
  4. 导致 .set 成为 firebase
  5. 回到 2。

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

【问题讨论】:

  • 您可以添加一个新变量 firebaseValue 并在您的 _computeRef 函数中更新它。在 _valueChanged 函数中,仅当 aValue 与 firebaseValue 不同时才调用 ref.set。

标签: polymer object.observe


【解决方案1】:

只需将 _valueChangedMethod 更改为此

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

这将使观察者只有在值实际发生变化时才开始工作。

【讨论】:

    【解决方案2】:

    据我所知,没有内置方法可以在不触发观察者的情况下设置属性值。

    您无法控制调用观察者的方式/时间/参数,但您可以控制过程主体,幸运的是,您使用的是共享状态 (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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2012-09-08
      • 1970-01-01
      相关资源
      最近更新 更多