Polymer.dart中的生命周期事件顺序

时间:2014-04-18 12:11:40

标签: dart dart-polymer

我对Polymer.dart中生命周期事件的顺序存在差异

当在Dartium中运行dart代码以及在Chrome中运行已编译的JavaScript时,事件以不同的顺序发生。

我有2个Polymer元素:Parent和Child,我在created和enteredView函数中添加了输出。

输出是: Dartium:

ChildElement created
ChildElement enteredView. Variable value: InitMsg
ParentElement created
ParentElement enteredView

铬:

ChildElement created
ParentElement created
ParentElement enteredView
ChildElement enteredView. Variable value: InitMsg

问题是:

  • 这个结果是完全随意的,还是有一些可以依赖的顺序?
  • 如果在Parent的创建方法中指定了变量,则新值显然在Child的enteredView中不可见。我需要根据新值进行一些计算。子节点中的PathObserver是获得此分配通知的唯一解决方案,还是在父级的created()之后发生了一些时间/生命周期回调,当这个值在子级中可见时?

我的代码:

parentelement.dart:

import 'package:polymer/polymer.dart';

@CustomTag('parent-element')
class ParentElement extends PolymerElement {
  @observable String msg = "InitMsg";

  ParentElement.created() : super.created() {
    print('Parent created');
    msg = "Changed msg";
  }

  @override
    void enteredView() {
      super.enteredView();
      print('ParentElement enteredView');     
    }


}

parentelement.html

<link rel="import" href="childelement.html">

<polymer-element name="parent-element">
  <template>    
    <div>      
      <span>Parent Msg: {{msg}}</span>
    </div>
    <child-element msg="{{msg}}"></child-element>    
  </template>
  <script type="application/dart" src="parentelement.dart"></script>
</polymer-element>

childelement.dart:

import 'package:polymer/polymer.dart';

@CustomTag('child-element')
class ChildElement extends PolymerElement {
  @published String msg;

 ChildElement.created() : super.created() {
   print('ChildElement created');
 }

 @override
 void enteredView() {
   super.enteredView();
   print('ChildElement enteredView. Variable value: $msg');     
 }
}

childelement.html

<polymer-element name="child-element">
  <template>    
    <div>      
      <span>Child msg: {{msg}}</span>
    </div>
  </template>
  <script type="application/dart" src="childelement.dart"></script>
</polymer-element>

2 个答案:

答案 0 :(得分:2)

created构造函数不适合,如果您想要依赖它们的调用顺序。 据我所知,polymerCreated回调应该更适合您的要求。

我不喜欢&#39;真的知道因为 enteredView attached满足了我的所有要求,因此我从未使用其他东西( entereView attached为自己的代码提供了两个不同的插槽:&#39;在super.attached()&#39;之后&#39;在super.attached()之后&#39;)

答案 1 :(得分:1)

我遇到了类似的问题,并在博文(http://www.roberthartung.de/animatr-gui-structure-nesting-polymer-elements/)中对其进行了描述。对我来说,诀窍是将<link rel="import"> - 语句放在中心位置,而不是自定义元素本身。我的应用程序只有一个导入我的自定义GUI元素。 GUI导入其直接自定义子元素,依此类推。

希望这会有所帮助 罗伯特