upgrade ember.js master

This commit is contained in:
Sven Fuchs 2012-06-19 11:47:55 +02:00
parent 5aa55f2064
commit 3121aa551a
5 changed files with 207 additions and 121 deletions

View File

@ -5,32 +5,36 @@ App = Em.Application.create();
App.Store = DS.Store.extend({ revision: 4, adapter: DS.fixtureAdapter }); App.Store = DS.Store.extend({ revision: 4, adapter: DS.fixtureAdapter });
App.Repository = DS.Model.extend({ App.Repository = DS.Model.extend({
slug: DS.attr('string'),
ownerName: DS.attr('string'), ownerName: DS.attr('string'),
name: DS.attr('string'), name: DS.attr('string'),
builds: DS.hasMany('App.Build', { key: 'build_ids' }),
lastBuild: function() {
return this.getPath('builds.firstObject');
}.property()
}); });
App.Build = DS.Model.extend({ App.Build = DS.Model.extend({
repositoryId: DS.attr('number'),
number: DS.attr('number'), number: DS.attr('number'),
repository: DS.belongsTo('App.Repository') repository: DS.belongsTo('App.Repository')
}); });
App.Repository.FIXTURES = [ App.Build.FIXTURES = [
{ id: 1, slug: 'travis-ci/travis-core', owner_name: 'travis-ci', name: 'travis-core' }, { id: 1, repositoryId: 1, repository_id: 1, number: 1 },
{ id: 2, slug: 'travis-ci/travis-assets', owner_name: 'travis-ci', name: 'travis-assets' }, { id: 2, repositoryId: 1, repository_id: 1, number: 2 },
{ id: 3, slug: 'travis-ci/travis-hub', owner_name: 'travis-ci', name: 'travis-hub' }, { id: 3, repositoryId: 2, repository_id: 2, number: 3 },
{ id: 4, repositoryId: 3, repository_id: 3, number: 4 }
]; ];
App.Build.FIXTURES = [ App.Repository.FIXTURES = [
{ id: 1, repository_id: 1, number: 1 }, { id: 1, owner_name: 'travis-ci', name: 'travis-core', build_ids: [1, 2] },
{ id: 2, repository_id: 1, number: 2 }, { id: 2, owner_name: 'travis-ci', name: 'travis-assets', build_ids: [3] },
{ id: 3, repository_id: 2, number: 3 }, { id: 3, owner_name: 'travis-ci', name: 'travis-hub', build_ids: [4] },
{ id: 4, repository_id: 3, number: 4 }
]; ];
App.ApplicationController = Em.Controller.extend(); App.ApplicationController = Em.Controller.extend();
App.RepositoriesController = Em.Controller.extend(); App.RepositoriesController = Em.ArrayController.extend();
App.RepositoryController = Em.Controller.extend(); App.RepositoryController = Em.Controller.extend();
App.TabsController = Em.Controller.extend(); App.TabsController = Em.Controller.extend();
App.CurrentController = Em.Controller.extend(); App.CurrentController = Em.Controller.extend();
@ -80,7 +84,7 @@ App.Router = Em.Router.extend({
connectOutlets: function(router) { connectOutlets: function(router) {
router.connectLayout({}, function(repository) { router.connectLayout({}, function(repository) {
router.connectCurrent(App.Build.find(1)) // should use repository.lastBuild() router.connectCurrent(repository.get('lastBuild'));
}); });
}, },
@ -99,7 +103,7 @@ App.Router = Em.Router.extend({
connectOutlets: function(router, repository) { connectOutlets: function(router, repository) {
var params = router.serializeRepository(repository); var params = router.serializeRepository(repository);
router.connectLayout(params, function(repository) { router.connectLayout(params, function(repository) {
router.connectCurrent(App.Build.find(1)) // should use repository.lastBuild() router.connectCurrent(repository.get('lastBuild'));
}); });
} }
}), }),
@ -115,7 +119,7 @@ App.Router = Em.Router.extend({
connectOutlets: function(router, repository) { connectOutlets: function(router, repository) {
var params = router.serializeRepository(repository); var params = router.serializeRepository(repository);
router.connectLayout(params, function(repository) { router.connectLayout(params, function(repository) {
router.connectHistory(App.Build.find()) router.connectHistory(repository.get('builds'))
}); });
} }
}), }),
@ -148,8 +152,8 @@ App.Router = Em.Router.extend({
serializeBuild: function(build) { serializeBuild: function(build) {
if(build instanceof DS.Model) { if(build instanceof DS.Model) {
// var repository = build.get('repository') var repository = build.get('repository')
var repository = App.Repository.find(build.get('repositoryId')); // wat. // var repository = App.Repository.find(build.get('repositoryId')); // wat.
var params = this.serializeRepository(repository); var params = this.serializeRepository(repository);
return $.extend(params, { id: build.get('id') }); return $.extend(params, { id: build.get('id') });
} else { } else {

View File

@ -1,2 +1,3 @@
current repo current build {{content.id}}

View File

@ -1,5 +1,5 @@
<ul class="tabs"> <ul class="tabs">
<li><a {{action viewCurrent href=true context="repository"}}>Current</a></li> <li><a {{action viewCurrent href=true context="repository"}} class="current">Current</a></li>
<li><a {{action viewHistory href=true context="repository"}}>History</a></li> <li><a {{action viewHistory href=true context="repository"}} class="history">History</a></li>
<li><a {{action viewBuild href=true context="build"}}>Build</a></li> <li><a {{action viewBuild href=true context="build"}} class="build">Build #{{build.number}}</a></li>
</ul> </ul>

View File

@ -2162,7 +2162,7 @@ var DirtyState = DS.State.extend({
invokeLifecycleCallbacks: function(manager) { invokeLifecycleCallbacks: function(manager) {
var record = get(manager, 'record'); var record = get(manager, 'record');
record.fire('becameInvalid', record); record.trigger('becameInvalid', record);
} }
}) })
}); });
@ -2252,7 +2252,7 @@ var states = {
// TRANSITIONS // TRANSITIONS
exit: function(manager) { exit: function(manager) {
var record = get(manager, 'record'); var record = get(manager, 'record');
record.fire('didLoad'); record.trigger('didLoad');
}, },
// EVENTS // EVENTS
@ -2306,9 +2306,9 @@ var states = {
invokeLifecycleCallbacks: function(manager, dirtyType) { invokeLifecycleCallbacks: function(manager, dirtyType) {
var record = get(manager, 'record'); var record = get(manager, 'record');
if (dirtyType === 'created') { if (dirtyType === 'created') {
record.fire('didCreate', record); record.trigger('didCreate', record);
} else { } else {
record.fire('didUpdate', record); record.trigger('didUpdate', record);
} }
} }
}), }),
@ -2411,7 +2411,7 @@ var states = {
invokeLifecycleCallbacks: function(manager) { invokeLifecycleCallbacks: function(manager) {
var record = get(manager, 'record'); var record = get(manager, 'record');
record.fire('didDelete', record); record.trigger('didDelete', record);
} }
}) })
}), }),
@ -2426,7 +2426,7 @@ var states = {
invokeLifecycleCallbacks: function(manager) { invokeLifecycleCallbacks: function(manager) {
var record = get(manager, 'record'); var record = get(manager, 'record');
record.fire('becameError', record); record.trigger('becameError', record);
} }
}) })
}) })
@ -2902,7 +2902,7 @@ DS.Model = Ember.Object.extend(Ember.Evented, {
Override the default event firing from Ember.Evented to Override the default event firing from Ember.Evented to
also call methods with the given name. also call methods with the given name.
*/ */
fire: function(name) { trigger: function(name) {
this[name].apply(this, [].slice.call(arguments, 1)); this[name].apply(this, [].slice.call(arguments, 1));
this._super.apply(this, arguments); this._super.apply(this, arguments);
} }

View File

@ -3344,6 +3344,8 @@ function deferEvent(obj, eventName) {
}); });
return function() { return function() {
if (obj.isDestroyed) { return; }
if (obj !== Ember && 'function' === typeof obj.sendEvent) { if (obj !== Ember && 'function' === typeof obj.sendEvent) {
obj.sendEvent.apply(obj, a_slice.call(params, 1)); obj.sendEvent.apply(obj, a_slice.call(params, 1));
} }
@ -6970,6 +6972,9 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
if (addAmt === undefined) addAmt=-1; if (addAmt === undefined) addAmt=-1;
} }
// Make sure the @each proxy is set up if anyone is observing @each
if (Ember.isWatching(this, '@each')) { get(this, '@each'); }
Ember.sendEvent(this, '@array:before', startIdx, removeAmt, addAmt); Ember.sendEvent(this, '@array:before', startIdx, removeAmt, addAmt);
var removing, lim; var removing, lim;
@ -6983,9 +6988,6 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
this.enumerableContentWillChange(removing, addAmt); this.enumerableContentWillChange(removing, addAmt);
// Make sure the @each proxy is set up if anyone is observing @each
if (Ember.isWatching(this, '@each')) { get(this, '@each'); }
return this; return this;
}, },
@ -7920,6 +7922,10 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
return this; return this;
}, },
addBeforeObserver: function(key, target, method) {
Ember.addBeforeObserver(this, key, target, method);
},
/** /**
Adds an observer on a property. Adds an observer on a property.
@ -8204,10 +8210,34 @@ Ember.Evented = Ember.Mixin.create({
Ember.addListener(this, name, target, method, xform); Ember.addListener(this, name, target, method, xform);
}, },
fire: function(name) { one: function(name, target, method) {
if (!method) {
method = target;
target = null;
}
var wrapped = function() {
Ember.removeListener(this, name, target, wrapped);
// Internally, a `null` target means that the target is
// the first parameter to addListener. That means that
// the `this` passed into this function is the target
// determined by the event system.
method.apply(this, arguments);
};
this.on(name, target, wrapped);
},
trigger: function(name) {
Ember.sendEvent.apply(null, [this, name].concat(a_slice.call(arguments, 1))); Ember.sendEvent.apply(null, [this, name].concat(a_slice.call(arguments, 1)));
}, },
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.");
this.trigger.apply(this, arguments);
},
off: function(name, target, method) { off: function(name, target, method) {
Ember.removeListener(this, name, target, method); Ember.removeListener(this, name, target, method);
}, },
@ -12755,7 +12785,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
*/ */
_notifyWillInsertElement: function() { _notifyWillInsertElement: function() {
this.invokeRecursively(function(view) { this.invokeRecursively(function(view) {
view.fire('willInsertElement'); view.trigger('willInsertElement');
}); });
}, },
@ -12767,7 +12797,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
*/ */
_notifyDidInsertElement: function() { _notifyDidInsertElement: function() {
this.invokeRecursively(function(view) { this.invokeRecursively(function(view) {
view.fire('didInsertElement'); view.trigger('didInsertElement');
}); });
}, },
@ -12779,7 +12809,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
*/ */
_notifyWillRerender: function() { _notifyWillRerender: function() {
this.invokeRecursively(function(view) { this.invokeRecursively(function(view) {
view.fire('willRerender'); view.trigger('willRerender');
}); });
}, },
@ -12818,7 +12848,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
*/ */
_notifyWillDestroyElement: function() { _notifyWillDestroyElement: function() {
this.invokeRecursively(function(view) { this.invokeRecursively(function(view) {
view.fire('willDestroyElement'); view.trigger('willDestroyElement');
}); });
}, },
@ -13248,7 +13278,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
}, 'isVisible'), }, 'isVisible'),
_notifyBecameVisible: function() { _notifyBecameVisible: function() {
this.fire('becameVisible'); this.trigger('becameVisible');
this.forEachChildView(function(view) { this.forEachChildView(function(view) {
var isVisible = get(view, 'isVisible'); var isVisible = get(view, 'isVisible');
@ -13260,7 +13290,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
}, },
_notifyBecameHidden: function() { _notifyBecameHidden: function() {
this.fire('becameHidden'); this.trigger('becameHidden');
this.forEachChildView(function(view) { this.forEachChildView(function(view) {
var isVisible = get(view, 'isVisible'); var isVisible = get(view, 'isVisible');
@ -13304,7 +13334,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
Override the default event firing from Ember.Evented to Override the default event firing from Ember.Evented to
also call methods with the given name. also call methods with the given name.
*/ */
fire: function(name) { trigger: function(name) {
this._super.apply(this, arguments); this._super.apply(this, arguments);
if (this[name]) { if (this[name]) {
return this[name].apply(this, [].slice.call(arguments, 1)); return this[name].apply(this, [].slice.call(arguments, 1));
@ -13678,7 +13708,7 @@ Ember.View.states.hasElement = {
if (view.has(eventName)) { if (view.has(eventName)) {
// Handler should be able to re-dispatch events, so we don't // Handler should be able to re-dispatch events, so we don't
// preventDefault or stopPropagation. // preventDefault or stopPropagation.
return view.fire(eventName, evt); return view.trigger(eventName, evt);
} else { } else {
return true; // continue event propagation return true; // continue event propagation
} }
@ -14573,7 +14603,7 @@ Ember.State = Ember.Object.extend(Ember.Evented,
Override the default event firing from Ember.Evented to Override the default event firing from Ember.Evented to
also call methods with the given name. also call methods with the given name.
*/ */
fire: function(name) { trigger: function(name) {
if (this[name]) { if (this[name]) {
this[name].apply(this, [].slice.call(arguments, 1)); this[name].apply(this, [].slice.call(arguments, 1));
} }
@ -14689,7 +14719,34 @@ Ember.State = Ember.Object.extend(Ember.Evented,
var Event = Ember.$ && Ember.$.Event; var Event = Ember.$ && Ember.$.Event;
Ember.State.reopenClass({ Ember.State.reopenClass(
/** @scope Ember.State */{
/**
@static
Creates an action function for transitioning to the named state while preserving context.
The following example StateManagers are equivalent:
aManager = Ember.StateManager.create({
stateOne: Ember.State.create({
changeToStateTwo: Ember.State.transitionTo('stateTwo')
}),
stateTwo: Ember.State.create({})
})
bManager = Ember.StateManager.create({
stateOne: Ember.State.create({
changeToStateTwo: function(manager, context){
manager.transitionTo('stateTwo', context)
}
}),
stateTwo: Ember.State.create({})
})
@param {String} target
*/
transitionTo: function(target) { transitionTo: function(target) {
var event = function(stateManager, context) { var event = function(stateManager, context) {
if (Event && context instanceof Event) { if (Event && context instanceof Event) {
@ -15060,6 +15117,24 @@ var arrayForEach = Ember.ArrayPolyfills.forEach;
robotManager.send('beginExtermination', allHumans) robotManager.send('beginExtermination', allHumans)
robotManager.getPath('currentState.name') // 'rampaging' robotManager.getPath('currentState.name') // 'rampaging'
Transition actions can also be created using the `transitionTo` method of the Ember.State class. The
following example StateManagers are equivalent:
aManager = Ember.StateManager.create({
stateOne: Ember.State.create({
changeToStateTwo: Ember.State.transitionTo('stateTwo')
}),
stateTwo: Ember.State.create({})
})
bManager = Ember.StateManager.create({
stateOne: Ember.State.create({
changeToStateTwo: function(manager, context){
manager.transitionTo('stateTwo', context)
}
}),
stateTwo: Ember.State.create({})
})
**/ **/
Ember.StateManager = Ember.State.extend( Ember.StateManager = Ember.State.extend(
/** @scope Ember.StateManager.prototype */ { /** @scope Ember.StateManager.prototype */ {
@ -15326,7 +15401,7 @@ Ember.StateManager = Ember.State.extend(
state = this.findStatesByRoute(state, path); state = this.findStatesByRoute(state, path);
state = state[state.length-1]; state = state[state.length-1];
state.fire(get(this, 'transitionEvent'), this, context); state.trigger(get(this, 'transitionEvent'), this, context);
}, this); }, this);
}, },
@ -15347,12 +15422,12 @@ Ember.StateManager = Ember.State.extend(
exitStates = exitStates.slice(0).reverse(); exitStates = exitStates.slice(0).reverse();
arrayForEach.call(exitStates, function(state) { arrayForEach.call(exitStates, function(state) {
state.fire('exit', stateManager); state.trigger('exit', stateManager);
}); });
arrayForEach.call(enterStates, function(state) { arrayForEach.call(enterStates, function(state) {
if (log) { Ember.Logger.log("STATEMANAGER: Entering " + get(state, 'path')); } if (log) { Ember.Logger.log("STATEMANAGER: Entering " + get(state, 'path')); }
state.fire('enter', stateManager); state.trigger('enter', stateManager);
}); });
var startState = state, var startState = state,
@ -15367,7 +15442,7 @@ Ember.StateManager = Ember.State.extend(
enteredState = startState; enteredState = startState;
if (log) { Ember.Logger.log("STATEMANAGER: Entering " + get(startState, 'path')); } if (log) { Ember.Logger.log("STATEMANAGER: Entering " + get(startState, 'path')); }
startState.fire('enter', stateManager); startState.trigger('enter', stateManager);
initialState = get(startState, 'initialState'); initialState = get(startState, 'initialState');
@ -15455,6 +15530,7 @@ Ember.Routable = Ember.Mixin.create({
*/ */
stashContext: function(manager, context) { stashContext: function(manager, context) {
var serialized = this.serialize(manager, context); var serialized = this.serialize(manager, context);
manager.setStateMeta(this, 'serialized', serialized); manager.setStateMeta(this, 'serialized', serialized);
if (get(this, 'isRoutable') && !get(manager, 'isRouting')) { if (get(this, 'isRoutable') && !get(manager, 'isRouting')) {
@ -16217,6 +16293,11 @@ Ember.ViewState = Ember.State.extend(
/** @scope Ember.ViewState.prototype */ { /** @scope Ember.ViewState.prototype */ {
isViewState: true, isViewState: true,
init: function() {
Ember.deprecate("Ember.ViewState is deprecated and will be removed from future releases. Consider using the outlet pattern to display nested views instead. For more information, see http://emberjs.com/guides/outlets/.");
return this._super();
},
enter: function(stateManager) { enter: function(stateManager) {
var view = get(this, 'view'), root, childViews; var view = get(this, 'view'), root, childViews;
@ -17744,7 +17825,7 @@ EmberHandlebars.ViewHelper = Ember.Object.create({
if (!hash.hasOwnProperty(prop)) { continue; } if (!hash.hasOwnProperty(prop)) { continue; }
// Test if the property ends in "Binding" // Test if the property ends in "Binding"
if (Ember.IS_BINDING.test(prop)) { if (Ember.IS_BINDING.test(prop) && typeof hash[prop] === 'string') {
path = hash[prop]; path = hash[prop];
normalized = Ember.Handlebars.normalizePath(null, path, data); normalized = Ember.Handlebars.normalizePath(null, path, data);