计算绑定似乎不会触发更改
Changes don't appear to fire for computed bindings
如果我为结构对象上的所有更改创建观察器,除非绑定是对计算绑定中值的更改,否则将调用观察器。
这是预期的行为吗?如果是这样,我如何捕获计算绑定中 属性 的更改?
示例:
<link rel="import" href="../../bower_components/paper-input/paper-input.html">
<dom-module id="binding-test">
<template>
<paper-input label="Not computed" value="{{myObject.prop1}}"></paper-input>
<paper-input label="Computed" value="{{computeIt(myObject.prop2)}}"></paper-input>
</template>
<script>
Polymer({
is:"binding-test",
properties: {
myObject: {
type: Object,
notify: true,
value: {
prop1: 1,
prop2: 2
}
}
},
observers: [
'somethingChanged(myObject.*)'
],
somethingChanged: function(changeRecord) {
// This code is never executed when the Computed input field is changed
console.log(changeRecord);
},
computeIt: function(value) {
return value;
}
});
</script>
</dom-module>
我可能对这个有误,但我认为 computed binding 是 one-way,与 computed 相同属性.
如果你真的想在 paper-input 上通知更改,你可以监听 value-changed
事件,然后执行 notifyPath
/set
在 "myObject.prop2"
.
<paper-input label="Computed" on-value-changed="valueChanged" value="{{computeIt(myObject.prop2)}}"></paper-input>
valueChanged: function(e) {
this.set("myObject.prop2", e.detail.value);
}
看看这个 plunker。
更新
我认为您的问题有更好的解决方案。不再使用 expressions/filters 来回转换值,paper-input
现在允许您定义 prefix
和 suffix
,如下所示 -
<paper-input label="revenue" type="number">
<div prefix>$</div>
</paper-input>
<paper-input label="email">
<div suffix>@email.com</div>
</paper-input>
您甚至可以像这样定义复杂的输入(尽管您需要创建自己的 date-input
元素)-
<paper-input-container auto-validate>
<label>Social Security Number</label>
<ssn-input class="paper-input-input"></ssn-input>
<paper-input-error>SSN invalid!</paper-input-error>
</paper-input-container>
以上代码示例取自here. You can read more about it on Polymer's official website over here。
如果我为结构对象上的所有更改创建观察器,除非绑定是对计算绑定中值的更改,否则将调用观察器。
这是预期的行为吗?如果是这样,我如何捕获计算绑定中 属性 的更改?
示例:
<link rel="import" href="../../bower_components/paper-input/paper-input.html">
<dom-module id="binding-test">
<template>
<paper-input label="Not computed" value="{{myObject.prop1}}"></paper-input>
<paper-input label="Computed" value="{{computeIt(myObject.prop2)}}"></paper-input>
</template>
<script>
Polymer({
is:"binding-test",
properties: {
myObject: {
type: Object,
notify: true,
value: {
prop1: 1,
prop2: 2
}
}
},
observers: [
'somethingChanged(myObject.*)'
],
somethingChanged: function(changeRecord) {
// This code is never executed when the Computed input field is changed
console.log(changeRecord);
},
computeIt: function(value) {
return value;
}
});
</script>
</dom-module>
我可能对这个有误,但我认为 computed binding 是 one-way,与 computed 相同属性.
如果你真的想在 paper-input 上通知更改,你可以监听 value-changed
事件,然后执行 notifyPath
/set
在 "myObject.prop2"
.
<paper-input label="Computed" on-value-changed="valueChanged" value="{{computeIt(myObject.prop2)}}"></paper-input>
valueChanged: function(e) {
this.set("myObject.prop2", e.detail.value);
}
看看这个 plunker。
更新
我认为您的问题有更好的解决方案。不再使用 expressions/filters 来回转换值,paper-input
现在允许您定义 prefix
和 suffix
,如下所示 -
<paper-input label="revenue" type="number">
<div prefix>$</div>
</paper-input>
<paper-input label="email">
<div suffix>@email.com</div>
</paper-input>
您甚至可以像这样定义复杂的输入(尽管您需要创建自己的 date-input
元素)-
<paper-input-container auto-validate>
<label>Social Security Number</label>
<ssn-input class="paper-input-input"></ssn-input>
<paper-input-error>SSN invalid!</paper-input-error>
</paper-input-container>
以上代码示例取自here. You can read more about it on Polymer's official website over here。