DART POLYMER:如何从另一个自定义元素更新属性?

时间:2014-07-23 19:07:50

标签: dart dart-polymer

我想通过其他自定义元素( localized_element )更新自定义元素( signin_element )中的属性标签。但属性标签在操作期间已将类型从Map更改为String。

说明:

1 /应用程序启动后,自定义元素(signin-element)使用Map更新属性标签(请参阅文件signin.dart)。

2 /初始化自定义元素 localized-element 后,使用外部json文件中的新Map更新属性标签。方法更新无法为属性标签分配新地图,因为现在是字符串

铬回报警告:

  

signin-element上的属性是在Polymer之前绑定的数据   升级元素。这可能会导致绑定类型不正确。

     

localized-element的属性是在Polymer之前绑定的数据   升级元素。这可能会导致绑定类型不正确。

最后返回一个错误:

Class 'String' has no instance method '[]='.

enter image description here

Signin.html:

<core-animated-pages selectedindex="0" notap id="core_animated_pages">
    <section id="section1" layout horizontal active center-justified center>
      <core-card id="core_card" layout vertical>
        <paper-input label="Your email addres" floatinglabel id="email_input"></paper-input>
        <paper-input label="Your password" floatinglabel id="password_input"></paper-input>
        <div id="div" layout horizontal end-justified>
          <paper-fab icon="check" id="paper_fab"></paper-fab>
        </div>
        <h2>{{labels['hello']}}</h2>
      </core-card>
    </section>
  </core_animated_pages>

  <localized-element id="l10n" locale={{locale}} labels={{labels}}></localized-element>

signin.dart

@CustomTag('signin-element')
class Signin extends PolymerElement {

  @published String locale = 'en';

  @observable Map labels = toObservable({
    'hello': 'Hello 1'
  });

  Signin.created() : super.created();
}

localized.dart

@CustomTag('localized-element')
class Localized extends PolymerElement {

  @published String locale = 'en';
  @published Map labels;

  Localized.created() : super.created();

  ready() {
    super.ready();
    _loadTranslations();
  }

  update() {
    if (!_l10n.containsKey(locale)) return;

    var l10n = _l10n[locale];

    labels['hello'] = l10n['hello'];
  }

  List locales = ['en', 'fr'];
  _loadTranslations() {
    locales.forEach((l10n)=> _loadLocale(l10n));
  }

  Map _l10n = {};
  _loadLocale(_l) {
    HttpRequest.getString('i18n/translation_${_l}.json')
      .then((res) {
        _l10n[_l] = JSON.decode(res);
        update();
      })
      .catchError((Error error) {
        print(error.toString());
      });
  }

}

2 个答案:

答案 0 :(得分:3)

我认为你需要改变

@published Map labels;

在localized.dart中

@PublishedProperty(reflect: true) Map labels;

locale

相同

Google Groups - Dart Web Development - PSA: Polymer 0.11.0 @published properties no longer reflect to attributes by default

答案 1 :(得分:1)

Günter找到了解决方案,如果您遇到同样的问题,我会推动代码更改。

首先,将聚合物依赖关系更新为dev:

polymer: '>=0.12.0-dev <0.13.0'

其次,从localized.dart替换@published

@PublishedProperty(reflect: true) String locale = 'en';
@PublishedProperty(reflect: true) Map labels;

并在文件signin.dart

@PublishedProperty(reflect: true)