Skip to content

Commit 9bafab3

Browse files
committed
Fixed use of computed field inside template helpers.
Fixes: #12
1 parent 87e2448 commit 9bafab3

File tree

3 files changed

+50
-13
lines changed

3 files changed

+50
-13
lines changed

lib.coffee

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,35 @@ class ComputedField
88
handle = null
99
lastValue = null
1010

11+
# TODO: Provide an option to prevent using view's autorun.
12+
# One can wrap code with Blaze._withCurrentView(null, code) to prevent using view's autorun for now.
1113
if currentView = Package.blaze?.Blaze?.currentView
12-
autorun = (f) ->
13-
currentView.autorun f
14+
if currentView._isInRender
15+
# Inside render we cannot use currentView.autorun directly, so we use our own version of it.
16+
# This allows computed fields to be created inside Blaze template helpers, which are called
17+
# the first time inside render. While currentView.autorun is disallowed inside render because
18+
# autorun would be recreated for reach re-render, this is exactly what computed field does
19+
# anyway so it is OK for use to use autorun in this way.
20+
autorun = (f) ->
21+
templateInstanceFunc = Package.blaze.Blaze.Template._currentTemplateInstanceFunc
22+
23+
comp = Tracker.autorun (c) ->
24+
Package.blaze.Blaze._withCurrentView currentView, ->
25+
Package.blaze.Blaze.Template._withTemplateInstanceFunc templateInstanceFunc, ->
26+
f.call currentView, c
27+
28+
stopComputation = ->
29+
comp.stop()
30+
currentView.onViewDestroyed stopComputation
31+
comp.onStop ->
32+
currentView.removeViewDestroyedListener stopComputation
33+
34+
comp
35+
36+
else
37+
autorun = (f) ->
38+
currentView.autorun f
39+
1440
else
1541
autorun = Tracker.autorun
1642

tests_client.coffee

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ Template.computedFieldTestTemplate.onCreated ->
1616

1717
output.push f()
1818

19+
Template.computedFieldTestTemplate.helpers
20+
bar: ->
21+
field = new ComputedField =>
22+
foo = Template.currentData()?.foo?()
23+
if _.isNumber foo
24+
foo % 10
25+
else
26+
''
27+
28+
field()
29+
1930
Template.computedFieldTestTemplate.events
2031
'click .computedFieldTestTemplate': (event) ->
2132
Template.instance().field()
@@ -35,21 +46,21 @@ class TemplateTestCase extends ClassyTestCase
3546
Tracker.afterFlush @expect()
3647
,
3748
->
38-
@assertEqual $('.computedFieldTestTemplate').text(), '42'
49+
@assertEqual $('.computedFieldTestTemplate').text(), '42|2'
3950

4051
@internal.set 43
4152
# Field flush happens automatically when using getter.
4253
@assertEqual @foo(), 43
4354

4455
# There was no global flush yet, so old value is rendered.
45-
@assertEqual $('.computedFieldTestTemplate').text(), '42'
56+
@assertEqual $('.computedFieldTestTemplate').text(), '42|2'
4657

4758
Tracker.afterFlush @expect()
4859
,
4960
->
5061
# But after global flush we want that the new value is rendered, even if we flushed
5162
# the autorun before the global flush happened (by calling a getter).
52-
@assertEqual $('.computedFieldTestTemplate').text(), '43'
63+
@assertEqual $('.computedFieldTestTemplate').text(), '43|3'
5364

5465
Blaze.remove @rendered
5566

@@ -82,7 +93,7 @@ class TemplateTestCase extends ClassyTestCase
8293
Tracker.afterFlush @expect()
8394
,
8495
->
85-
@assertEqual $('.computedFieldTestTemplate').text(), '45'
96+
@assertEqual $('.computedFieldTestTemplate').text(), '45|5'
8697

8798
# Autorun is running again.
8899
@assertTrue @foo._isRunning()
@@ -107,7 +118,7 @@ class TemplateTestCase extends ClassyTestCase
107118
Tracker.afterFlush @expect()
108119
,
109120
->
110-
@assertEqual $('.computedFieldTestTemplate').text(), ''
121+
@assertEqual $('.computedFieldTestTemplate').text(), '|'
111122

112123
$('.computedFieldTestTemplate').click()
113124

@@ -143,25 +154,25 @@ class TemplateTestCase extends ClassyTestCase
143154
Tracker.afterFlush @expect()
144155
,
145156
->
146-
@assertEqual $('.computedFieldTestTemplate').text(), '42'
157+
@assertEqual $('.computedFieldTestTemplate').text(), '42|2'
147158

148159
@internal.set 43
149160

150-
@assertEqual $('.computedFieldTestTemplate').text(), '42'
161+
@assertEqual $('.computedFieldTestTemplate').text(), '42|2'
151162

152163
Tracker.afterFlush @expect()
153164
,
154165
->
155-
@assertEqual $('.computedFieldTestTemplate').text(), '43'
166+
@assertEqual $('.computedFieldTestTemplate').text(), '43|3'
156167

157168
@internal.set 53
158169

159-
@assertEqual $('.computedFieldTestTemplate').text(), '43'
170+
@assertEqual $('.computedFieldTestTemplate').text(), '43|3'
160171

161172
Tracker.afterFlush @expect()
162173
,
163174
->
164-
@assertEqual $('.computedFieldTestTemplate').text(), '53'
175+
@assertEqual $('.computedFieldTestTemplate').text(), '53|3'
165176

166177
Blaze.remove @rendered
167178

tests_client.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<template name="computedFieldTestTemplate">
2-
<div class="computedFieldTestTemplate">{{foo}}</div>
2+
<div class="computedFieldTestTemplate">{{foo}}|{{bar}}</div>
33
</template>

0 commit comments

Comments
 (0)