Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 引用不同实例变量上相同对象的两个聚合元素(图纸输入)无效_Dart_Polymer_Dart Polymer - Fatal编程技术网

Dart 引用不同实例变量上相同对象的两个聚合元素(图纸输入)无效

Dart 引用不同实例变量上相同对象的两个聚合元素(图纸输入)无效,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"&

我有两个聚合元素(纸张输入)在不同的实例变量上引用同一对象

当我更改一个图纸输入元素上的文本时,另一个图纸元素不会更改,尽管引用的对象已更改

详情如下:

>>浏览器

>>main_app.html

<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');