computed.jsView |
---|
32 | 32 … | this.outputValue = null |
33 | 33 … | this.inner = null |
34 | 34 … | this.updating = false |
35 | 35 … | this.live = false |
36 | | - this.lazy = false |
37 | 36 … | this.initialized = false |
38 | 37 … | this.listeners = [] |
39 | 38 … | this.observables = observables |
40 | 39 … | this.lambda = lambda |
46 | 45 … | |
47 | 46 … | this.context = opts && opts.context || {} |
48 | 47 … | this.boundOnUpdate = this.onUpdate.bind(this) |
49 | 48 … | this.boundUpdateNow = this.updateNow.bind(this) |
| 49 … | + this.boundUnlisten = this.unlisten.bind(this) |
50 | 50 … | } |
51 | 51 … | |
52 | 52 … | ProtoComputed.prototype = { |
53 | 53 … | MutantComputed: function (listener) { |
85 | 85 … | if (this.inner) { |
86 | 86 … | this.releaseInner = this.inner(this.onInnerUpdate.bind(this, this.inner)) |
87 | 87 … | } |
88 | 88 … | this.live = true |
89 | | - this.lazy = true |
| 89 … | + this.update() |
90 | 90 … | |
91 | 91 … | if (this.opts && this.opts.onListen) { |
92 | 92 … | var release = this.opts.onListen() |
93 | 93 … | if (typeof release === 'function') { |
96 | 96 … | } |
97 | 97 … | } |
98 | 98 … | }, |
99 | 99 … | unlisten: function () { |
100 | | - if (this.live) { |
| 100 … | + if (this.live && !this.listeners.length) { |
101 | 101 … | this.live = false |
102 | 102 … | |
103 | 103 … | if (this.releaseInner) { |
104 | 104 … | this.releaseInner() |
184 | 184 … | this.broadcast() |
185 | 185 … | } |
186 | 186 … | }, |
187 | 187 … | getValue: function () { |
188 | | - var wasLazy = this.live && this.lazy |
189 | | - if (!this.live || this.lazy || this.updating) { |
190 | | - this.lazy = false |
191 | | - if (this.opts && this.opts.nextTick && this.live && this.lazy) { |
192 | | - this.onUpdate() |
193 | | - } else { |
194 | | - if (this.update() && wasLazy) { |
195 | | - this.broadcast() |
196 | | - } |
197 | | - } |
198 | | - if (this.inner) { |
199 | | - this.outputValue = resolve(this.inner) |
200 | | - } |
| 188 … | + if (!this.updating && !this.live) { |
| 189 … | + |
| 190 … | + |
| 191 … | + this.listen() |
| 192 … | + setImmediate(this.boundUnlisten) |
201 | 193 … | } |
202 | 194 … | return this.outputValue |
203 | 195 … | }, |
204 | 196 … | broadcast: function () { |
211 | 203 … | } |
212 | 204 … | |
213 | 205 … | function extendedComputed (observables, update) { |
214 | 206 … | var live = false |
215 | | - var lazy = false |
216 | 207 … | |
217 | 208 … | var instance = computed(observables, function () { |
218 | 209 … | return update() |
219 | 210 … | }, { |
220 | | - onListen: function () { live = lazy = true }, |
| 211 … | + onListen: function () { live = true }, |
221 | 212 … | onUnlisten: function () { live = false } |
222 | 213 … | }) |
223 | 214 … | |
224 | 215 … | instance.checkUpdated = function () { |
225 | | - if (!live || lazy) { |
226 | | - lazy = false |
| 216 … | + if (!live) { |
227 | 217 … | update() |
228 | 218 … | } |
229 | 219 … | } |
230 | 220 … | |