【问题标题】:An attached callback during children.clear in parent's detached callback父级分离回调中的children.clear期间的附加回调
【发布时间】:2016-06-02 10:28:27
【问题描述】:

简单场景:有 2 个 Web 组件,childparent 内。 当将 parent 重新插入到其他地方时,parentdetached 回调已被调用,并且 children.clear() 在其中调用(可能是这里很愚蠢)。 在清除孩子的过程中,我可以看到不仅 孩子的 分离 cb 调用了,而且 attached 也调用了:

https://dartpad.dartlang.org/26921310fb7f85dee672

import 'dart:html';

void main() {

  document.registerElement("x-my", MyElement);
  document.registerElement("x-ch", MyChild);
  var container = new Element.tag("x-my");
  document.body.children.add( container );
  print("creation done");

  // just re-add container to somewhere else
  var anothercontainer = new Element.div();
  document.body.children.add( anothercontainer );
  anothercontainer.children.add(container);

}

class MyElement extends HtmlElement {
  MyElement.created() : super.created();

  @override
  attached() {
    print("attached enter ${this.outerHtml}");
    super.attached();
    children.add( new Element.tag("x-ch") );
    print("attached leave ${this.outerHtml}");
  }

   @override
  detached() {
    print("detached enter ${this.outerHtml}");
    children.clear();
    super.detached();
    print("detached leave ${this.outerHtml}");
  }
}

class MyChild extends HtmlElement {
  MyChild.created() : super.created() { this.innerHtml = "child created"; }

  @override
  attached() {
    print("attached enter ${this.outerHtml}");
    super.attached();
    print("attached leave ${this.outerHtml}");
  }

   @override
  detached() {
    print("detached enter ${this.outerHtml}");
    super.detached();
    print("detached leave ${this.outerHtml}");
  }
}

给出输出:

attached enter <x-my></x-my>
attached enter <x-ch>child created</x-ch>
attached leave <x-ch>child created</x-ch>
attached leave <x-my><x-ch>child created</x-ch></x-my>
creation done
detached enter <x-my><x-ch>child created</x-ch></x-my>
detached enter <x-ch>child created</x-ch>
detached leave <x-ch>child created</x-ch>
attached enter <x-ch>child created</x-ch> <---- my question
attached leave <x-ch>child created</x-ch>
detached enter <x-ch>child created</x-ch>
detached leave <x-ch>child created</x-ch> <---- ends here
detached leave <x-my></x-my>
attached enter <x-my></x-my>
attached enter <x-ch>child created</x-ch>
attached leave <x-ch>child created</x-ch>
attached leave <x-my><x-ch>child created</x-ch></x-my>

【问题讨论】:

  • Chrome 48.0.2564.97 中的此类行为。

标签: dart web-component dart-html


【解决方案1】:

关于此 AFAIR 存在一个未解决的问题。我认为这是由于从自定义元素的构造函数中修改 DOM 造成的。

尝试移动

 this.innerHtml = "child created";

attached()

【讨论】:

  • 但是在重新附加元素时不会调用ctor,不是吗?
猜你喜欢
  • 2016-05-24
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多