Data binding 如何根据需要在聚合物中动态创建特性
我有一个用例,其中我有一个组件(如数据库),我希望将所有信息作为可绑定属性公开。但是,使用这些属性的任何特定客户都只需要其中的少数属性。数据库中可能有1000个条目。我怎样才能知道客户实际需要哪些 例如:Data binding 如何根据需要在聚合物中动态创建特性,data-binding,polymer,Data Binding,Polymer,我有一个用例,其中我有一个组件(如数据库),我希望将所有信息作为可绑定属性公开。但是,使用这些属性的任何特定客户都只需要其中的少数属性。数据库中可能有1000个条目。我怎样才能知道客户实际需要哪些 例如: Polymer('database, { observer : { name : function(oldVal, newVal) { onDataChanged('name', newVal);}, addr : funct
Polymer('database,
{
observer : {
name : function(oldVal, newVal) { onDataChanged('name', newVal);},
addr : function(oldVal, newVal) { onDataChanged('addr', newVal);},
tel.main : function(oldVal, newVal) { onDataChanged('tel.main',
etc....
}
});
在这种情况下,我只希望动态地为实际需要的数据绑定创建观察处理程序。如果您愿意让客户端扩展组件以指定所需的数据库字段,那么您可以仅为它们指定的字段动态地创建观察程序 例子 组成部分
动态特性
有关更改,请参阅控制台
聚合物({
//验证它是否是允许的属性
//例如,我们将允许任何以validitem开头的内容
isValidateAttribute:函数(名称){
return(name.match(“^validitem”);
},
//获取属性
已创建:函数(){
for(此.publish中的名称){
log(“正在尝试:+名称);
//确认它是一个动态属性
if(this.isValidAttribute(name)){
console.log(“接受:+名称);
此[名称]=“从数据库中提取”;
//参考资料:
// https://www.polymer-project.org/0.5/docs/polymer/node_bind.html
// https://github.com/Polymer/NodeBind/blob/master/tests/tests.js
// https://github.com/polymer/observe-js
var observer=新的病理观察者(此,名称);
open(makeHandler(this,name));
}
}
/*************试验**********************************/
//通过更新来验证动态更新是否有效
此.job('update_validitem1',function(){
this.validitem1=“10秒后更新”;
}, 10000);
/************结束测试******************************/
}
});
//参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
函数makeHandler(元素、属性){
函数处理程序(newval、oldval){
log(“元素”+element,“属性:+property”,从:“+oldval”,到:“+newval”);
}
返回处理程序;
}
用法
演示dynamicproperties测试页面
演示
动态标签
输入
生产
{{item1choice2}}
问题的答案似乎是这件事做不到。当属性绑定(或试图绑定)到组件时,似乎没有任何钩子或事件可用于获取通知。我在这里提交了一个bug/增强请求
请求将来支持此功能。这并不能回答您的问题,但我认为,当使用聚合物构建构件时,您应该在构件名称中添加一个
-
。请将“数据库”更改为“数据库”,谢谢您的回复。然而,这正是我试图避免的。必须两次指定相同的信息。任何时候你这样做都会让自己暴露出程序员的错误,让它变得不那么用户友好。在没有在两个位置指定它的情况下,我能做的最好的事情是:客户机数据绑定更改->db元素属性->db元素代码更改。但相反,只有元素更改->db元素属性更改。使用客户端数据绑定时,看不到更新。如果client->db元素是您需要的唯一方向,那么我可以提供该代码,但它似乎是一个不完整的解决方案。它使用attributeChanged回调来检测更改,并且只选择我关心的属性。
<link rel="import" href="../../webcomponents/bower_components/polymer/polymer.html">
<polymer-element name=demo-dynamicproperties >
<template>
<h2>dynamic properties</h2>
See the console for changes
</template>
<script>
Polymer({
// Validate that it is an attribute that is allowed
// For the example we will allow anything starting with validitem
isValidAttribute: function(name) {
return (name.match('^validitem'));
},
// Get attributes
created: function() {
for (name in this.publish) {
console.log("Trying: "+name);
// Verify that it is one of the dynamic attributes
if (this.isValidAttribute(name)) {
console.log("Accepting: "+name);
this[name]="Pull from DB";
// References:
// https://www.polymer-project.org/0.5/docs/polymer/node_bind.html
// https://github.com/Polymer/NodeBind/blob/master/tests/tests.js
// https://github.com/polymer/observe-js
var observer = new PathObserver(this,name);
observer.open(makeHandler(this,name));
}
}
/************* TEST **********************************/
// Verify that dynamic updates worked by updating
this.job('update_validitem1', function() {
this.validitem1="Updated after 10 seconds";
}, 10000);
/************ End Test ******************************/
}
});
// Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
function makeHandler(element, property) {
function handler(newval,oldval) {
console.log("element" + element,"property:" + property,"from:"+oldval,"to:"+newval);
}
return handler;
}
</script>
</polymer-element>
<!DOCTYPE HTML>
<html lang="en">
<head>
<script src="../../webcomponents/bower_components/webcomponentsjs/webcomponents.min.js"></script>
<link rel="import" href="../../webcomponents/bower_components/polymer/polymer.html">
<link rel="import" href="demo-dynamicproperties.html">
<title>demo-dynamicproperties test page</title>
</head>
<body>
<polymer-element name=demo-usedb extends="demo-dynamicproperties" attributes="validitem1 validitem2 invaliditem" noscript>
</polymer-element>
<h1>Demo</h1>
<template is="auto-binding">
<h2>Dynamic tag</h2>
<demo-usedb validitem1="{{item1choice2}}" item2="setthis"></demo-usedb>
<h2>Input</h2>
<input type="text" value="{{item1choice2}}">
<h3>Produces</h3>
{{item1choice2}}
</template>
</body>
</html>