Dart 引用不同实例变量上相同对象的两个聚合元素(图纸输入)无效
我有两个聚合元素(纸张输入)在不同的实例变量上引用同一对象 当我更改一个图纸输入元素上的文本时,另一个图纸元素不会更改,尽管引用的对象已更改 详情如下: >>浏览器 >>main_app.htmlDart 引用不同实例变量上相同对象的两个聚合元素(图纸输入)无效,dart,polymer,dart-polymer,Dart,Polymer,Dart Polymer,我有两个聚合元素(纸张输入)在不同的实例变量上引用同一对象 当我更改一个图纸输入元素上的文本时,另一个图纸元素不会更改,尽管引用的对象已更改 详情如下: >>浏览器 >>main_app.html <dom-module id="main-app"> <template> <h3>Lista de Produtos</h3> <paper-fab icon="add" on-tap="adicionarProduto"&
<dom-module id="main-app">
<template>
<h3>Lista de Produtos</h3>
<paper-fab icon="add" on-tap="adicionarProduto"></paper-fab>
<template is="dom-repeat" items="{{produtos}}" as="item">
<div class="layout vertical">
<paper-material elevation="1">
<div class="layout horizontal">
<paper-input label="Produto" value="{{item.descricao}}"></paper-input>
</div>
</paper-material>
<template is="dom-repeat" items="{{item.componentes}}" as="item_comp">
<div class="layout vertical">
<div class="layout horizontal">
<paper-input label="Produto Componente" value="{{item_comp.descricao}}"></paper-input>
</div>
</div>
</template>
</div>
</template>
</template>
</dom-module>
产品目录
>main_app.dart
@PolymerRegister('main-app')
class MainApp extends PolymerElement {
@property
List<Produto> produtos = new List();
MainApp.created() : super.created();
void ready() {
Produto p = new Produto()..descricao = 'teste';
add('produtos', p);
Produto p2 = new Produto()..descricao = 'teste 2';
add('produtos', p2);
Produto p3 = new Produto()..descricao = 'teste3';
add('produtos', p3);
add('produtos.2.componentes', p);
add('produtos.2.componentes', p2);
}
@reflectable
void adicionarProduto(e, d) {
//...
}
}
class Produto extends JsProxy {
@property
String descricao;
@property
List<Produto> componentes;
Produto() {
componentes = new List();
}
}
@PolymerRegister('main-app'))
类MainApp扩展了聚合关系{
@财产
List produtos=新列表();
MainApp.created():super.created();
void ready(){
Produto p=new Produto()…descripcao='teste';
添加('produtos',p);
Produto p2=新的Produto()…descripcao='teste2';
添加('produtos',p2);
Produto p3=新的Produto()…描述='teste3';
添加('produtos',p3);
添加('produtos.2.组件',p);
添加(“产品2.组件”,p2);
}
@可反射
虚无阿迪西奥鸣人(e,d){
//...
}
}
类Produto扩展了JsProxy{
@财产
字符串描述符;
@财产
列出组成部分;
Produto(){
组件=新列表();
}
}
这是一个错误还是需要执行其他操作?这不是一个错误,因为Polymer不会观察内部属性的更改,因此当您编辑描述时,会更新该值,但不会通知其他输入,也不会更新其值 解决问题的一种方法是向输入元素添加一个on-change处理程序。在侦听器代码调用中
this.notifyPath(itemPath)
您需要生成正确的路径,例如“produtos.3.descripcao”,因此需要元素的索引。为此,您可以使用dom repeat的indexForElement
方法
//inside the change event listener (js code)
//You need to give your dom-repeat and id
var index = this.$.myDomRepeatTemplateId.indexForElement(ev.target)
@property
/@property()
仅适用于聚合物元件。对模型类成员使用@reflectable
class Produto extends JsProxy {
@reflectable
String descricao;
@reflectable
List<Produto> componentes;
Produto() {
componentes = new List();
}
}
类Produto扩展了JsProxy{
@可反射
字符串描述符;
@可反射
列出组成部分;
Produto(){
组件=新列表();
}
}
基于@HugoZapata的回答,我创建了一个工作示例模型中的递归性使这成为一个相当大的挑战。也许有一个更简单的方法,但这正是我能够做到的。Günter,你已经在另一篇文章中帮助我了解了这些信息(
@reflectable
,适用于模型类成员)。出于好奇,我添加了@属性
注释并进行了工作。@property
和@reflectable
之间的真正区别是什么?对于模型类,您只需要@reflectable
就可以让JS访问成员@Property()
是一种更为复杂的注释,具有附加的“功能”,仅适用于真正的聚合物元素,但它包含了@reflectable
提供的功能。因此,在一个模型类上使用@reflectable
好的,我知道现在是这样。我们希望在不久的将来,聚合物能够透明地处理这个问题。那太好了!实际上,只有在dart代码中设置值时,才不需要调用notifyPath。您正在使用所有正确的API来执行此操作,因此似乎发生了其他事情。@JakeMacDonald,我不熟悉Dart,是否有JS版本没有的附加“观察者”功能?否则,我看不出没有notifyPath它是如何工作的,因为聚合物的设计并不能监控其内部性质。您应该能够使用linkpath
方法,但我还没有尝试过。好吧,这很难看,但添加了以下工作:linkpath('produtos.2.components.0','produtos.#0');链接路径('produtos.2.components.1','produtos.#1');链接路径('produtos.0','produtos.#2.组件。#0');链接路径('produtos.1','produtos.#2.组件。#1');