簡體   English   中英

dart-polymer:無法從事件處理程序設置屬性

[英]dart-polymer: cannot set an attribute from an event handler

以下代碼不起作用。 也許我做錯了什么..請更正我的代碼:

  1. index.html的:
<html>
<head>
    <title>Page</title>
    <link rel="import" href="msg_box.html">
</head>
<body>
  <msg-box id="msg" caption="Caption 1"></msg-box>
  <button id="btn">click me</button>
<script type="application/dart" src="index.dart"></script>
<script src="packages/browser/dart.js"></script>
</body>
</html>
import 'dart:html';
import 'package:polymer/polymer.dart';
import 'msg_box.dart';

void main() {
  initPolymer();

  ButtonElement btn = querySelector("#btn");

  btn.onMouseEnter.listen((e) {
    MsgBoxElement elm = querySelector("#msg");

    window.alert(elm.caption); // SHOWS 'Caption 1'

    elm.caption = "Caption 2"; // DON'T WORK!

    window.alert(elm.caption); // SHOWS 'Caption 2', BUT PAGE SHOWS 'Caption 1'!!!
  });`
}
  1. msg_box.html
<polymer-element name="msg-box" attributes="caption">
  <template>
  <h4>{{caption}}</h4> 
  </template>
  <script type="application/dart" src="msg_box.dart"></script>
</polymer-element>
import 'package:polymer/polymer.dart';
@CustomTag('msg-box')
class MsgBoxElement extends PolymerElement {
  // fields
  String _caption;
  String get caption => _caption;
  void set caption(String value) {
    _caption = notifyPropertyChange(#caption, _caption, value);
  }

  MsgBoxElement.created() : super.created() {
  }
}

這個問題對我來說至關重要。 另請參閱https://code.google.com/p/dart/issues/detail?id=14753&sort=-id&colspec=ID%20Type%20Status%20Priority%20Area%20Milestone%20Owner%20Summary

我認為這里的問題是有未處理的待處理更改通知,因為您的代碼未在臟檢查區域中運行。 你可以做兩件事來解決這個問題:

  • 在更新caption后立即調用Observable.dirtyCheck() ; 要么,
  • 在臟檢查區域中運行您的代碼:
void main() {
  var dirtyCheckingZone = initPolymer();
  dirtyCheckingZone.run(() {
     ButtonElement btn = querySelector("#btn");
     btn.onMouseEnter.listen((e) {
       MsgBoxElement elm = querySelector("#msg");
       elm.caption = "Caption 2";
    });
  });
}

此區域確保在執行任何回調或偵聽器之后,我們將為您調用Observable.dirtyCheck。 這種方法稍微好於顯式調用dirtyCheck,因為當我們編譯部署時,我們會從臟檢查切換到顯式通知。 initPolymer返回的區域已更改為反映此情況。

另請注意:如果使用@published注釋,則可以簡化上面的MsgBoxElement。 這意味着表示屬性既可以觀察也可以作為元素的屬性公開。

import 'package:polymer/polymer.dart';

@CustomTag('msg-box')
class MsgBoxElement extends PolymerElement {
  @published String caption;
  MsgBoxElement.created() : super.created();
}

根據您的信息,似乎正在更新模型,但DOM未更新,很可能是因為未設置可觀察元素。 嘗試將以下注釋添加到msg_box dart代碼中:

import 'package:polymer/polymer.dart';
@CustomTag('msg-box')
class MsgBoxElement extends PolymerElement {
  // fields
  @observable String _caption;
  @reflectable String get caption => _caption;
  @reflectable void set caption(String value) {
    _caption = notifyPropertyChange(#caption, _caption, value);
  }

  MsgBoxElement.created() : super.created() {
  }
}

請參閱有關@reflectable屬性的dart郵件列表中的此更改公告 另請參閱有關設置@observable getters的討論

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM