- From: Joe Pea <notifications@github.com>
- Date: Sat, 02 Feb 2019 13:10:34 -0800
- To: w3c/webcomponents <webcomponents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/webcomponents/issues/787/459999420@github.com>
My assumption is that I **_need_** to clean up the observer by calling `disconnect()` on it when I no longer need it. Is this true?
If we don't have to call `disconnect()` and can rest assured that it will be GC'ed when there's no references to the Node, Node's children, the observer, the observer callback functions, or anything in the observer callback functions' scopes, then the above example could be simplified to the following:
```js
import Class from 'lowclass'
import Mixin from '../core/Mixin'
import { observeChildren } from '../core/Utility'
export default
Mixin(Base => Class('WithChildren').extends(Base, ({ Super, Private, Public }) => ({
isConnected: false,
constructor(...args) {
const self = Super(this).constructor(...args)
Private(self).__createObserver()
return self
},
connectedCallback() {
this.isConnected = true
Super(this).connectedCallback && Super(this).connectedCallback()
// We have to manually trigger childConnectedCallbacks on connect.
const currentChildren = this.children
// NOTE! Luckily Promise.resolve() fires AFTER all children connectedCallbacks,
// which makes it similar to the MutationObserver events!
Promise.resolve().then(() => {
for (let l=currentChildren.length, i=0; i<l; i+=1) {
this.childConnectedCallback && this.childConnectedCallback(currentChildren[i])
}
})
},
disconnectedCallback() {
this.isConnected = false
Super(this).disconnectedCallback && Super(this).disconnectedCallback()
// Here we have to manually trigger childDisconnectedCallbacks on disconnect
const lastKnownChildren = this.children
// NOTE! Luckily Promise.resolve() fires AFTER all children disconnectedCallbacks,
// which makes it similar to the MutationObserver events!
Promise.resolve().then(() => {
for (let l=lastKnownChildren.length, i=0; i<l; i+=1) {
this.childDisconnectedCallback && this.childDisconnectedCallback(lastKnownChildren[i])
}
})
},
private: {
__createObserver() {
const self = Public(this)
observeChildren(
self,
child => {
if (!self.isConnected) return
self.childConnectedCallback && self.childConnectedCallback(child)
},
child => {
if (!self.isConnected) return
self.childDisconnectedCallback && self.childDisconnectedCallback(child)
},
true
)
},
},
})))
```
Will this work? Can we expect things to be garbage collected when the node is not used anymore?
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/webcomponents/issues/787#issuecomment-459999420
Received on Saturday, 2 February 2019 21:10:59 UTC