数据绑定结构 object 在我的聚合物元素上没有显示任何变化

Databinding structured object does not show any change on my polymer element

我正在将应用程序从 0.5 迁移到 Polymer 1 并使用 Dart。我做得很好,但现在我面临一些数据绑定问题:

我创建了一个聚合物元素,它以编程方式在其本地 DOM 上插入另一个提供联系人信息的聚合物元素。第二个元素将从构造函数中获取信息,并通过数据绑定将其显示在界面上。

Parent飞镖:

@PolymerRegister('test-app')
class TestApp extends PolymerElement {  
  TestApp.created() : super.created();

  attached() {
      super.attached();
      async(() {
          insertTile();
      });
  }

  void insertTile() {
      String contactJSON = '{"contactId":"1", "firstName":"Lex", "surname":"Luthor"}';
      Contact contact = new Contact(JSON.decode(contactJSON));
      ContactTile tile = new ContactTile(contact, this);
      Polymer.dom(this.root).append(tile);
  }
}

Parent html:

<dom-module id="test-app">
  <style>
    :host {
      display: block;
    }
  </style>

  <template>
  </template>
</dom-module>

Children飞镖:

@PolymerRegister('contact-tile')
class ContactTile extends PolymerElement {
    factory ContactTile(Contact contact, Element parent) {
        ContactTile tile = new Element.tag('contact-tile');
        tile.contact = contact;
        return tile;
    }

    ContactTile.created() : super.created();

    @property Contact contact;
}

Children html:

<dom-module id="contact-tile">
  <style>
    :host {
      display: block;
    }
  </style>

  <template>
    <div>{{ contact.contactId }}</div>
    <div>{{ contact.firstName }}</div>
    <div>{{ contact.surname }}</div>
  </template>
</dom-module>

联系人class:

class Contact {
  String contactId;
  String firstName;
  String surname;    

  Contact(Map map) {
    contactId = map['contactId'];
    firstName = map['firstName'];
    surname = map['surname'];
  }
}

由于某种原因,在构造函数上更新联系人后,数据绑定不会在 Web 界面上显示联系人的任何属性。有人能帮我吗?我在 Polymer 0.5 上做了很多次,但在 Polymer 1 上这不起作用。

非常感谢。

================================

解决方案

该问题与未在 ContactTile 的构造函数上引发通知有关。我可以通过使用更新 属性 并通知的 "set" 函数修改联系人来解决此问题。有两种方法可以做到这一点:

一个。 @属性(通知:真)

@PolymerRegister('contact-tile')
class ContactTile extends PolymerElement {
    factory ContactTile(Contact contact, Element parent) {
        ContactTile tile = new Element.tag('contact-tile');
        tile.contact = contact;
        return tile;
    }

    ContactTile.created() : super.created();

    @Property(notify: true)
    Contact contact;
}

b。 polymerElement.set("name", 值);

@PolymerRegister('contact-tile')
class ContactTile extends PolymerElement {
    factory ContactTile(Contact contact, Element parent) {
        ContactTile tile = new Element.tag('contact-tile');
//        tile.contact = contact;
        tile.set("contact", contact);
        return tile;
    }

    ContactTile.created() : super.created();

    @property
    Contact contact;
}

另外,为了访问 object 属性,我必须使 class 扩展 JsProxy 并将 @属性 添加到每个属性(或 @reflectable 用于方法)。

import 'package:polymer/polymer.dart';

class Contact extends JsProxy {
  @property
  String contactId;
  @property
  String firstName;
  @property
  String surname;

  Contact(Map map) {
    contactId = map['contactId'];
    firstName = map['firstName'];
    surname = map['surname'];
  }
}

由于 Contact class 不是完整的自定义元素,它是否应该继承自 JsProxy 并具有属性注释。这将使 html 中的属性可访问。如下所示。

class Contact extends JsProxy {
  @property String contactId;
  @property String firstName;
  @property String surname;    

  Contact(Map map) {
    contactId = map['contactId'];
    firstName = map['firstName'];
    surname = map['surname'];
  }
}