就像标题所说的那样。有没有办法在不触发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无关。我相信解决方案是控制如何将更新应用于Polymer中的观察值。部分原因是firebase商店中的值的更改也可以由第3方(不一定是Web)应用程序进行。
答案 0 :(得分:4)
据我所知,没有内置的方法来设置属性值而不触发它的观察者。
您无法控制观察者调用的方式/时间/参数,但您可以控制过程体,幸运的是,您正在使用共享状态(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;
}
答案 1 :(得分:-1)
只需将_valueChangedMethod更改为此
即可LI
这将使观察者仅在值实际改变时才能工作。