自从0.4-0.5时代以来,我还没有使用过Polymer,我习惯使用像<my-element hidden="{{foo != bar}}"></my-element>
这样的隐藏属性
现在在Polymer 1.0中,我看到必须使用方法中的计算值来处理任何不是直接布尔值的值。 我的代码是这样的:
<my-element hidden="{{_computeHidden()}}"></my-element>
然后在脚本部分:
Polymer({
is: 'super-element',
properties: {...},
_computeHidden: function(){
console.log('its being called, mkay');
return !(foo == bar);
}
});
现在在控制台中,页面刷新后消息会出现两次,但当foo
的值发生更改时,元素不会消失。我做错了什么?
答案 0 :(得分:9)
所以,有两个问题。正如Maria所说,您必须将_computeHidden
方法绑定到将响应Polymer通知的参数。因此,必须将foo
和bar
都声明为元素的属性。
另一个问题是“隐藏”是boolean attribute,这意味着它的存在表明该元素应该被隐藏。在Polymer 1.0中,使用$
中的hidden$=
更改隐藏到属性绑定中并将处理字符串。如果没有$
,hidden=
将只评估原始布尔值。 hidden
不在原生html属性中所需$
的列表中,因此您可以自行选择。
Polymer({
is: 'my-element',
properties: {
foo: Boolean,
bar: Boolean
},
_computeHidden: function(){
return !(this.foo == this.bar);
}
});
<my-element hidden$="{{_computeHidden(foo, bar)}}"></my-element>
使用此annotated attribute binding,只有当您的计算值真实时才会在元素上显示“隐藏”,这是您想要的行为。使用简单的“=”绑定,即使函数返回true,或者为null或任何其他值,也会出现“hidden”。
答案 1 :(得分:7)
如果要在foo
更改时触发重新计算函数,则必须确保foo
是属性并将其作为参数传递给函数。这是一个小例子。
<dom-module id="register-me">
<template>
<div hidden$="{{compute(ishidden)}}">Hello from my local DOM</div>
<button on-click="toggle">Toggle Hidden</button>
</template>
<script>
Polymer({is: "register-me",
properties: { ishidden: {
type: Boolean,
value: false
} },
compute: function() {
console.log("computing...");
return this.ishidden;
},
toggle: function() {
this.ishidden = !this.ishidden;
}
});
</script>
</dom-module>
请注意,要绑定到属性,您应该使用$=
。