From 20c70c7fc62c654d642202e5b437cfb99a4bc14e Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Sat, 24 Oct 2015 18:39:10 -0400 Subject: [PATCH] [BUGFIX beta] Ensure closure actions are wrapped in a run loop. As discussed in Ember core team meeting on 2015-10-23. --- .../lib/keywords/closure-action.js | 16 ++++++------- .../tests/helpers/closure_action_test.js | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/packages/ember-routing-htmlbars/lib/keywords/closure-action.js b/packages/ember-routing-htmlbars/lib/keywords/closure-action.js index f77311ad07c..0c284988967 100644 --- a/packages/ember-routing-htmlbars/lib/keywords/closure-action.js +++ b/packages/ember-routing-htmlbars/lib/keywords/closure-action.js @@ -7,6 +7,7 @@ import { symbol } from 'ember-metal/utils'; import { get } from 'ember-metal/property_get'; import { labelForSubexpr } from 'ember-htmlbars/hooks/subexpr'; import EmberError from 'ember-metal/error'; +import run from 'ember-metal/run_loop'; export const INVOKE = symbol('INVOKE'); export const ACTION = symbol('ACTION'); @@ -70,25 +71,24 @@ function createClosureAction(target, action, valuePath, actionArguments) { var closureAction; if (actionArguments.length > 0) { - closureAction = function() { + closureAction = function(...passedArguments) { var args = actionArguments; - if (arguments.length > 0) { - var passedArguments = Array.prototype.slice.apply(arguments); + if (passedArguments.length > 0) { args = actionArguments.concat(passedArguments); } if (valuePath && args.length > 0) { args[0] = get(args[0], valuePath); } - return action.apply(target, args); + + return run.join(target, action, ...args); }; } else { - closureAction = function() { - var args = arguments; + closureAction = function(...args) { if (valuePath && args.length > 0) { - args = Array.prototype.slice.apply(args); args[0] = get(args[0], valuePath); } - return action.apply(target, args); + + return run.join(target, action, ...args); }; } diff --git a/packages/ember-routing-htmlbars/tests/helpers/closure_action_test.js b/packages/ember-routing-htmlbars/tests/helpers/closure_action_test.js index 7bee9de81a1..3afce482959 100644 --- a/packages/ember-routing-htmlbars/tests/helpers/closure_action_test.js +++ b/packages/ember-routing-htmlbars/tests/helpers/closure_action_test.js @@ -524,3 +524,27 @@ QUnit.test('action closure does not get auto-mut wrapped', function(assert) { innerComponent.fireAction(); }); }); + +QUnit.test('action should be called within a run loop', function(assert) { + assert.expect(1); + + innerComponent = EmberComponent.extend({ + fireAction() { + this.attrs.submit(); + } + }).create(); + + outerComponent = EmberComponent.extend({ + layout: compile(`{{view innerComponent submit=(action 'submit')}}`), + innerComponent, + actions: { + submit(newValue) { + assert.ok(run.currentRunLoop, 'action is called within a run loop'); + } + } + }).create(); + + runAppend(outerComponent); + + innerComponent.fireAction(); +});