diff --git a/README.md b/README.md index 785ea08d864..9b5aed03fd6 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,4 @@ app more and more Ember-1.0-compatible. * [Accessors](doc/accessors.md) * [Ember.Object.create](doc/object_create.md) * [Ember.ViewState](doc/view_state.md) + * [Ember.Evented#fire](doc/evented_fire.md) \ No newline at end of file diff --git a/doc/evented_fire.md b/doc/evented_fire.md new file mode 100644 index 00000000000..95162dd6304 --- /dev/null +++ b/doc/evented_fire.md @@ -0,0 +1,10 @@ +# Ember.Evented#fire + +In Ember 1.0, `Ember.Evented#fire` has been deprecated. This fork introduces a flag, `ENV.EVENTED_FIRE`, with two allowed values: + + * `null` (the default) -- `Ember.Evented#fire` works per 0.9.8.1 + * `"1.0"` -- Calling `Ember.Evented#fire` will trigger a deprecation warning + +In either case, `Ember.Evented#trigger` will work as per 1.0. + +See [issue #8](https://github.com/zendesk/ember.js/issues/8) for more information. diff --git a/packages/ember-runtime/lib/mixins/evented.js b/packages/ember-runtime/lib/mixins/evented.js index ad8ef755381..db7d8e94877 100644 --- a/packages/ember-runtime/lib/mixins/evented.js +++ b/packages/ember-runtime/lib/mixins/evented.js @@ -17,6 +17,11 @@ Ember.Evented = Ember.Mixin.create({ }, fire: function(name) { + Ember.deprecate("Ember.Evented#fire() has been deprecated in favor of trigger() for compatibility with jQuery. It will be removed in 1.0. Please update your code to call trigger() instead.", Ember.ENV.EVENTED_FIRE !== '1.0'); + this.trigger.apply(this, arguments); + }, + + trigger: function(name) { Ember.sendEvent.apply(null, [this, name].concat(a_slice.call(arguments, 1))); }, diff --git a/packages/ember-runtime/tests/backports/trigger_test.js b/packages/ember-runtime/tests/backports/trigger_test.js new file mode 100644 index 00000000000..697cffdfbd6 --- /dev/null +++ b/packages/ember-runtime/tests/backports/trigger_test.js @@ -0,0 +1,41 @@ +function matches(msg, substr) { + ok(msg.indexOf(substr) !== -1); +} + +var originalFlag, originalWarn, warnings; + +module("Backported Ember.Evented#trigger", { + setup: function() { + originalFlag = Ember.ENV.EVENTED_FIRE; + originalWarn = Ember.Logger.warn; + warnings = []; + Ember.Logger.warn = function(msg) { + warnings.push(msg.replace("WARNING: ", "")); + }; + }, + teardown: function() { + Ember.ENV.EVENTED_FIRE = originalFlag; + Ember.Logger.warn = originalWarn; + } +}); + +test("trigger works", function() { + var obj = Ember.Object.createWithMixins(Ember.Evented), + fooCalledWith; + + obj.on('foo', function() { + fooCalledWith = [].slice.call(arguments); + }); + + obj.trigger('foo', 'bar', 'baz'); + + deepEqual(fooCalledWith, ['bar', 'baz']); +}); + +test("fire warns on 1.0 level", function() { + Ember.ENV.EVENTED_FIRE = '1.0'; + var obj = Ember.Object.createWithMixins(Ember.Evented); + obj.fire('foo'); + equal(warnings.length, 1); + matches(warnings[0], "Ember.Evented#fire() has been deprecated in favor of trigger() for compatibility with jQuery. It will be removed in 1.0. Please update your code to call trigger() instead."); +}); \ No newline at end of file diff --git a/packages/ember-states/lib/state.js b/packages/ember-states/lib/state.js index cb4c65b05f0..830f6a7a14b 100644 --- a/packages/ember-states/lib/state.js +++ b/packages/ember-states/lib/state.js @@ -22,6 +22,13 @@ Ember.State = Ember.Object.extend(Ember.Evented, { Override the default event firing from Ember.Evented to also call methods with the given name. */ + trigger: function(name) { + if (this[name]) { + this[name].apply(this, [].slice.call(arguments, 1)); + } + this._super.apply(this, arguments); + }, + fire: function(name) { if (this[name]) { this[name].apply(this, [].slice.call(arguments, 1)); diff --git a/packages/ember-states/lib/state_manager.js b/packages/ember-states/lib/state_manager.js index e0f82bdb731..fbc3319c119 100644 --- a/packages/ember-states/lib/state_manager.js +++ b/packages/ember-states/lib/state_manager.js @@ -527,7 +527,7 @@ Ember.StateManager = Ember.State.extend( state = this.findStatesByRoute(state, path); state = state[state.length-1]; - state.fire('setupControllers', this, context); + state.trigger('setupControllers', this, context); }, this); //getPath(root, path).setupControllers(this, context); }, @@ -573,11 +573,11 @@ Ember.StateManager = Ember.State.extend( exitStates = exitStates.slice(0).reverse(); this.asyncEach(exitStates, function(state, transition) { - state.fire('exit', stateManager, transition); + state.trigger('exit', stateManager, transition); }, function() { this.asyncEach(enterStates, function(state, transition) { if (log) { Ember.Logger.log("STATEMANAGER: Entering " + get(state, 'path')); } - state.fire('enter', stateManager, transition); + state.trigger('enter', stateManager, transition); }, function() { var startState = state, enteredState, initialState; @@ -592,7 +592,7 @@ Ember.StateManager = Ember.State.extend( enteredState = startState; if (log) { Ember.Logger.log("STATEMANAGER: Entering " + get(startState, 'path')); } - startState.fire('enter', stateManager); + startState.trigger('enter', stateManager); initialState = get(startState, 'initialState'); diff --git a/packages/ember-views/lib/views/view.js b/packages/ember-views/lib/views/view.js index 39ae69686c4..dd7aeba3bb3 100644 --- a/packages/ember-views/lib/views/view.js +++ b/packages/ember-views/lib/views/view.js @@ -1323,7 +1323,7 @@ Ember.View = Ember.Object.extend(Ember.Evented, */ _notifyWillInsertElement: function() { this.invokeRecursively(function(view) { - view.fire('willInsertElement'); + view.trigger('willInsertElement'); }); }, @@ -1335,7 +1335,7 @@ Ember.View = Ember.Object.extend(Ember.Evented, */ _notifyDidInsertElement: function() { this.invokeRecursively(function(view) { - view.fire('didInsertElement'); + view.trigger('didInsertElement'); }); }, @@ -1347,7 +1347,7 @@ Ember.View = Ember.Object.extend(Ember.Evented, */ _notifyWillRerender: function() { this.invokeRecursively(function(view) { - view.fire('willRerender'); + view.trigger('willRerender'); }); }, @@ -1386,7 +1386,7 @@ Ember.View = Ember.Object.extend(Ember.Evented, */ _notifyWillDestroyElement: function() { this.invokeRecursively(function(view) { - view.fire('willDestroyElement'); + view.trigger('willDestroyElement'); }); }, @@ -1822,7 +1822,7 @@ Ember.View = Ember.Object.extend(Ember.Evented, }, 'isVisible'), _notifyBecameVisible: function() { - this.fire('becameVisible'); + this.trigger('becameVisible'); this.forEachChildView(function(view) { var isVisible = get(view, 'isVisible'); @@ -1834,7 +1834,7 @@ Ember.View = Ember.Object.extend(Ember.Evented, }, _notifyBecameHidden: function() { - this.fire('becameHidden'); + this.trigger('becameHidden'); this.forEachChildView(function(view) { var isVisible = get(view, 'isVisible'); @@ -1878,6 +1878,13 @@ Ember.View = Ember.Object.extend(Ember.Evented, Override the default event firing from Ember.Evented to also call methods with the given name. */ + trigger: function(name) { + if (this[name]) { + this[name].apply(this, [].slice.call(arguments, 1)); + } + this._super.apply(this, arguments); + }, + fire: function(name) { if (this[name]) { this[name].apply(this, [].slice.call(arguments, 1));