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.Repository = DS.Model.extend({
slug: DS.attr('string'),
ownerName: 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({
repositoryId: DS.attr('number'),
number: DS.attr('number'),
repository: DS.belongsTo('App.Repository')
});
App.Repository.FIXTURES = [
{ id: 1, slug: 'travis-ci/travis-core', owner_name: 'travis-ci', name: 'travis-core' },
{ id: 2, slug: 'travis-ci/travis-assets', owner_name: 'travis-ci', name: 'travis-assets' },
{ id: 3, slug: 'travis-ci/travis-hub', owner_name: 'travis-ci', name: 'travis-hub' },
App.Build.FIXTURES = [
{ id: 1, repositoryId: 1, repository_id: 1, number: 1 },
{ id: 2, repositoryId: 1, repository_id: 1, number: 2 },
{ id: 3, repositoryId: 2, repository_id: 2, number: 3 },
{ id: 4, repositoryId: 3, repository_id: 3, number: 4 }
];
App.Build.FIXTURES = [
{ id: 1, repository_id: 1, number: 1 },
{ id: 2, repository_id: 1, number: 2 },
{ id: 3, repository_id: 2, number: 3 },
{ id: 4, repository_id: 3, number: 4 }
App.Repository.FIXTURES = [
{ id: 1, owner_name: 'travis-ci', name: 'travis-core', build_ids: [1, 2] },
{ id: 2, owner_name: 'travis-ci', name: 'travis-assets', build_ids: [3] },
{ id: 3, owner_name: 'travis-ci', name: 'travis-hub', build_ids: [4] },
];
App.ApplicationController = Em.Controller.extend();
App.RepositoriesController = Em.Controller.extend();
App.RepositoriesController = Em.ArrayController.extend();
App.RepositoryController = Em.Controller.extend();
App.TabsController = Em.Controller.extend();
App.CurrentController = Em.Controller.extend();
@ -80,7 +84,7 @@ App.Router = Em.Router.extend({
connectOutlets: function(router) {
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) {
var params = router.serializeRepository(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) {
var params = router.serializeRepository(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) {
if(build instanceof DS.Model) {
// var repository = build.get('repository')
var repository = App.Repository.find(build.get('repositoryId')); // wat.
var repository = build.get('repository')
// var repository = App.Repository.find(build.get('repositoryId')); // wat.
var params = this.serializeRepository(repository);
return $.extend(params, { id: build.get('id') });
} else {

View File

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

View File

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

View File

@ -2162,7 +2162,7 @@ var DirtyState = DS.State.extend({
invokeLifecycleCallbacks: function(manager) {
var record = get(manager, 'record');
record.fire('becameInvalid', record);
record.trigger('becameInvalid', record);
}
})
});
@ -2252,7 +2252,7 @@ var states = {
// TRANSITIONS
exit: function(manager) {
var record = get(manager, 'record');
record.fire('didLoad');
record.trigger('didLoad');
},
// EVENTS
@ -2306,9 +2306,9 @@ var states = {
invokeLifecycleCallbacks: function(manager, dirtyType) {
var record = get(manager, 'record');
if (dirtyType === 'created') {
record.fire('didCreate', record);
record.trigger('didCreate', record);
} else {
record.fire('didUpdate', record);
record.trigger('didUpdate', record);
}
}
}),
@ -2411,7 +2411,7 @@ var states = {
invokeLifecycleCallbacks: function(manager) {
var record = get(manager, 'record');
record.fire('didDelete', record);
record.trigger('didDelete', record);
}
})
}),
@ -2426,7 +2426,7 @@ var states = {
invokeLifecycleCallbacks: function(manager) {
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
also call methods with the given name.
*/
fire: function(name) {
trigger: function(name) {
this[name].apply(this, [].slice.call(arguments, 1));
this._super.apply(this, arguments);
}

View File

@ -3344,6 +3344,8 @@ function deferEvent(obj, eventName) {
});
return function() {
if (obj.isDestroyed) { return; }
if (obj !== Ember && 'function' === typeof obj.sendEvent) {
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;
}
// 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);
var removing, lim;
@ -6983,9 +6988,6 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
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;
},
@ -7920,6 +7922,10 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
return this;
},
addBeforeObserver: function(key, target, method) {
Ember.addBeforeObserver(this, key, target, method);
},
/**
Adds an observer on a property.
@ -8204,8 +8210,32 @@ Ember.Evented = Ember.Mixin.create({
Ember.addListener(this, name, target, method, xform);
},
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)));
},
fire: function(name) {
Ember.sendEvent.apply(null, [this, name].concat(a_slice.call(arguments, 1)));
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) {
@ -12755,7 +12785,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
*/
_notifyWillInsertElement: function() {
this.invokeRecursively(function(view) {
view.fire('willInsertElement');
view.trigger('willInsertElement');
});
},
@ -12767,7 +12797,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
*/
_notifyDidInsertElement: function() {
this.invokeRecursively(function(view) {
view.fire('didInsertElement');
view.trigger('didInsertElement');
});
},
@ -12779,7 +12809,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
*/
_notifyWillRerender: function() {
this.invokeRecursively(function(view) {
view.fire('willRerender');
view.trigger('willRerender');
});
},
@ -12818,7 +12848,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
*/
_notifyWillDestroyElement: function() {
this.invokeRecursively(function(view) {
view.fire('willDestroyElement');
view.trigger('willDestroyElement');
});
},
@ -13248,7 +13278,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');
@ -13260,7 +13290,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');
@ -13304,7 +13334,7 @@ Ember.View = Ember.Object.extend(Ember.Evented,
Override the default event firing from Ember.Evented to
also call methods with the given name.
*/
fire: function(name) {
trigger: function(name) {
this._super.apply(this, arguments);
if (this[name]) {
return this[name].apply(this, [].slice.call(arguments, 1));
@ -13678,7 +13708,7 @@ Ember.View.states.hasElement = {
if (view.has(eventName)) {
// Handler should be able to re-dispatch events, so we don't
// preventDefault or stopPropagation.
return view.fire(eventName, evt);
return view.trigger(eventName, evt);
} else {
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
also call methods with the given name.
*/
fire: function(name) {
trigger: function(name) {
if (this[name]) {
this[name].apply(this, [].slice.call(arguments, 1));
}
@ -14689,7 +14719,34 @@ Ember.State = Ember.Object.extend(Ember.Evented,
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) {
var event = function(stateManager, context) {
if (Event && context instanceof Event) {
@ -15060,6 +15117,24 @@ var arrayForEach = Ember.ArrayPolyfills.forEach;
robotManager.send('beginExtermination', allHumans)
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(
/** @scope Ember.StateManager.prototype */ {
@ -15326,7 +15401,7 @@ Ember.StateManager = Ember.State.extend(
state = this.findStatesByRoute(state, path);
state = state[state.length-1];
state.fire(get(this, 'transitionEvent'), this, context);
state.trigger(get(this, 'transitionEvent'), this, context);
}, this);
},
@ -15347,12 +15422,12 @@ Ember.StateManager = Ember.State.extend(
exitStates = exitStates.slice(0).reverse();
arrayForEach.call(exitStates, function(state) {
state.fire('exit', stateManager);
state.trigger('exit', stateManager);
});
arrayForEach.call(enterStates, function(state) {
if (log) { Ember.Logger.log("STATEMANAGER: Entering " + get(state, 'path')); }
state.fire('enter', stateManager);
state.trigger('enter', stateManager);
});
var startState = state,
@ -15367,7 +15442,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');
@ -15455,6 +15530,7 @@ Ember.Routable = Ember.Mixin.create({
*/
stashContext: function(manager, context) {
var serialized = this.serialize(manager, context);
manager.setStateMeta(this, 'serialized', serialized);
if (get(this, 'isRoutable') && !get(manager, 'isRouting')) {
@ -16217,6 +16293,11 @@ Ember.ViewState = Ember.State.extend(
/** @scope Ember.ViewState.prototype */ {
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) {
var view = get(this, 'view'), root, childViews;
@ -17744,7 +17825,7 @@ EmberHandlebars.ViewHelper = Ember.Object.create({
if (!hash.hasOwnProperty(prop)) { continue; }
// 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];
normalized = Ember.Handlebars.normalizePath(null, path, data);