update ember.js

This commit is contained in:
Sven Fuchs 2012-06-27 16:39:02 +02:00
parent c7b561a80e
commit a42b3f133c
2 changed files with 480 additions and 230 deletions

View File

@ -1,5 +1,5 @@
// Version: v0.9.8.1-437-g68d406e
// Last commit: 68d406e (2012-06-25 14:59:55 -0700)
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
(function() {
@ -136,8 +136,8 @@ window.ember_deprecateFunc = Ember.deprecateFunc("ember_deprecateFunc is deprec
})();
// Version: v0.9.8.1-437-g68d406e
// Last commit: 68d406e (2012-06-25 14:59:55 -0700)
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
(function() {
@ -944,7 +944,7 @@ Ember.isArray = function(obj) {
Ember.makeArray(); => []
Ember.makeArray(null); => []
Ember.makeArray(undefined); => []
Ember.makeArray('lindsay'); => ['lindsay']
Ember.makeArray('lindsay'); => ['lindsay']
Ember.makeArray([1,2,42]); => [1,2,42]
var controller = Ember.ArrayProxy.create({ content: [] });
@ -3646,7 +3646,7 @@ Ember.RunLoop = RunLoop;
call.
Ember.run(function(){
// code to be execute within a RunLoop
// code to be execute within a RunLoop
});
@name run
@ -3684,7 +3684,7 @@ var run = Ember.run;
an lower-level way to use a RunLoop instead of using Ember.run().
Ember.run.begin();
// code to be execute within a RunLoop
// code to be execute within a RunLoop
Ember.run.end();
@ -3700,7 +3700,7 @@ Ember.run.begin = function() {
instead of using Ember.run().
Ember.run.begin();
// code to be execute within a RunLoop
// code to be execute within a RunLoop
Ember.run.end();
@returns {void}
@ -5448,7 +5448,7 @@ Ember.inspect = function(obj) {
/**
Compares two objects, returning true if they are logically equal. This is
a deeper comparison than a simple triple equal. For sets it will compare the
internal objects. For any other object that implements `isEqual()` it will
internal objects. For any other object that implements `isEqual()` it will
respect that method.
Ember.isEqual('hello', 'hello'); => true
@ -5630,7 +5630,7 @@ Ember.String = {
> beta
> gamma
@param {String} str
@param {String} str
The string to split
@returns {String} split string
@ -5639,7 +5639,7 @@ Ember.String = {
/**
Converts a camelized string into all lower case separated by underscores.
'innerHTML'.decamelize() => 'inner_html'
'action_name'.decamelize() => 'action_name'
'css-class-name'.decamelize() => 'css-class-name'
@ -5656,7 +5656,7 @@ Ember.String = {
/**
Replaces underscores or spaces with dashes.
'innerHTML'.dasherize() => 'inner-html'
'action_name'.dasherize() => 'action-name'
'css-class-name'.dasherize() => 'css-class-name'
@ -5823,7 +5823,7 @@ if (Ember.EXTEND_PROTOTYPES) {
/**
The `property` extension of Javascript's Function prototype is available
when Ember.EXTEND_PROTOTYPES is true, which is the default.
when Ember.EXTEND_PROTOTYPES is true, which is the default.
Computed properties allow you to treat a function like a property:
@ -5878,7 +5878,7 @@ if (Ember.EXTEND_PROTOTYPES) {
/**
The `observes` extension of Javascript's Function prototype is available
when Ember.EXTEND_PROTOTYPES is true, which is the default.
when Ember.EXTEND_PROTOTYPES is true, which is the default.
You can observe property changes simply by adding the `observes`
call to the end of your method declarations in classes that you write.
@ -5889,7 +5889,7 @@ if (Ember.EXTEND_PROTOTYPES) {
// Executes whenever the "value" property changes
}.observes('value')
});
@see Ember.Observable
*/
Function.prototype.observes = function() {
@ -5899,7 +5899,7 @@ if (Ember.EXTEND_PROTOTYPES) {
/**
The `observesBefore` extension of Javascript's Function prototype is
available when Ember.EXTEND_PROTOTYPES is true, which is the default.
available when Ember.EXTEND_PROTOTYPES is true, which is the default.
You can get notified when a property changes is about to happen by
by adding the `observesBefore` call to the end of your method
@ -5910,7 +5910,7 @@ if (Ember.EXTEND_PROTOTYPES) {
// Executes whenever the "value" property is about to change
}.observesBefore('value')
});
@see Ember.Observable
*/
Function.prototype.observesBefore = function() {
@ -6018,9 +6018,11 @@ function xform(target, method, params) {
libraries by implementing only methods that mostly correspond to the
JavaScript 1.8 API.
@extends Ember.Mixin
@since Ember 0.9
*/
Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
Ember.Enumerable = Ember.Mixin.create(
/** @scope Ember.Enumerable.prototype */ {
/** @private - compatibility */
isEnumerable: true,
@ -6051,9 +6053,9 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
The default implementation of this method simply looks up the index.
This works great on any Array-like objects.
@param index {Number} the current index of the iteration
@param previousObject {Object} the value returned by the last call to nextObject.
@param context {Object} a context object you can use to maintain state.
@param {Number} index the current index of the iteration
@param {Object} previousObject the value returned by the last call to nextObject.
@param {Object} context a context object you can use to maintain state.
@returns {Object} the next object in the iteration or undefined
*/
nextObject: Ember.required(Function),
@ -6148,7 +6150,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
to give your iterator function access to the current object.
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Object} receiver
*/
forEach: function(callback, target) {
@ -6170,7 +6172,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
/**
Alias for mapProperty
@params key {String} name of the property
@param {String} key name of the property
@returns {Array} The mapped array.
*/
getEach: function(key) {
@ -6213,7 +6215,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
to give your iterator function access to the current object.
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Array} The mapped array.
*/
map: function(callback, target) {
@ -6228,7 +6230,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
Similar to map, this specialized function returns the value of the named
property on all items in the enumeration.
@params key {String} name of the property
@param {String} key name of the property
@returns {Array} The mapped array.
*/
mapProperty: function(key) {
@ -6258,7 +6260,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
to give your iterator function access to the current object.
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Array} A filtered array.
*/
filter: function(callback, target) {
@ -6274,8 +6276,8 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
can pass an optional second argument with the target value. Otherwise
this will match any property that evaluates to true.
@params key {String} the property to test
@param value {String} optional value to test against.
@param {String} key the property to test
@param {String} [value] optional value to test against.
@returns {Array} filtered array
*/
filterProperty: function(key, value) {
@ -6303,7 +6305,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
to give your iterator function access to the current object.
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Object} Found item or null.
*/
find: function(callback, target) {
@ -6329,8 +6331,8 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
This method works much like the more generic find() method.
@params key {String} the property to test
@param value {String} optional value to test against.
@param {String} key the property to test
@param {String} [value] optional value to test against.
@returns {Object} found item or null
*/
findProperty: function(key, value) {
@ -6361,7 +6363,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
if (people.every(isEngineer)) { Paychecks.addBigBonus(); }
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Boolean}
*/
every: function(callback, target) {
@ -6374,8 +6376,8 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
Returns true if the passed property resolves to true for all items in the
enumerable. This method is often simpler/faster than using a callback.
@params key {String} the property to test
@param value {String} optional value to test against.
@param {String} key the property to test
@param {String} [value] optional value to test against.
@returns {Array} filtered array
*/
everyProperty: function(key, value) {
@ -6407,7 +6409,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
if (people.some(isManager)) { Paychecks.addBiggerBonus(); }
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Array} A filtered array.
*/
some: function(callback, target) {
@ -6420,8 +6422,8 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
Returns true if the passed property resolves to true for any item in the
enumerable. This method is often simpler/faster than using a callback.
@params key {String} the property to test
@param value {String} optional value to test against.
@param {String} key the property to test
@param {String} [value] optional value to test against.
@returns {Boolean} true
*/
someProperty: function(key, value) {
@ -6475,8 +6477,8 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
implements it. This method corresponds to the implementation in
Prototype 1.6.
@param methodName {String} the name of the method
@param args {Object...} optional arguments to pass as well.
@param {String} methodName the name of the method
@param {Object...} args optional arguments to pass as well.
@returns {Array} return values from calling invoke.
*/
invoke: function(methodName) {
@ -6507,9 +6509,9 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
/**
Returns a copy of the array with all null elements removed.
var arr = ["a", null, "c", null];
arr.compact(); => ["a", "c"]
arr.compact(); => ["a", "c"]
@returns {Array} the array without null elements.
*/
@ -6666,7 +6668,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
An enumerable of the objects to be removed or the number of items to
be removed.
@param {Ember.Enumerable|Numbe} adding
@param {Ember.Enumerable|Number} adding
An enumerable of the objects to be added or the number of items to be
added.
@ -7125,6 +7127,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
You should implement the compare() method.
@extends Ember.Mixin
@since Ember 0.9
*/
Ember.Comparable = Ember.Mixin.create( /** @scope Ember.Comparable.prototype */{
@ -7182,6 +7185,7 @@ var get = Ember.get, set = Ember.set;
Note that frozenCopy() will only work if you also implement Ember.Freezable.
@extends Ember.Mixin
@since Ember 0.9
*/
Ember.Copyable = Ember.Mixin.create(
@ -7293,6 +7297,7 @@ var get = Ember.get, set = Ember.set;
Ember.Copyable protocol, which defines a frozenCopy() method that will return
a frozen object, if the object implements this method as well.
@extends Ember.Mixin
@since Ember 0.9
*/
Ember.Freezable = Ember.Mixin.create(
@ -7509,7 +7514,7 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
colors.clear(); => []
colors.length(); => 0
@returns {Ember.Array} An empty Array.
@returns {Ember.Array} An empty Array.
*/
clear: function () {
var len = get(this, 'length');
@ -7703,15 +7708,15 @@ var get = Ember.get, set = Ember.set;
@class
## Overview
This mixin provides properties and property observing functionality, core
features of the Ember object model.
Properties and observers allow one object to observe changes to a
property on another object. This is one of the fundamental ways that
models, controllers and views communicate with each other in an Ember
application.
Any object that has this mixin applied can be used in observer
operations. That includes Ember.Object and most objects you will
interact with as you write your Ember application.
@ -7719,16 +7724,16 @@ var get = Ember.get, set = Ember.set;
Note that you will not generally apply this mixin to classes yourself,
but you will use the features provided by this module frequently, so it
is important to understand how to use it.
## Using get() and set()
Because of Ember's support for bindings and observers, you will always
access properties using the get method, and set properties using the
set method. This allows the observing objects to be notified and
computed properties to be handled properly.
More documentation about `get` and `set` are below.
## Observing Property Changes
You typically observe property changes simply by adding the `observes`
@ -7740,7 +7745,7 @@ var get = Ember.get, set = Ember.set;
// Executes whenever the "value" property changes
}.observes('value')
});
Although this is the most common way to add an observer, this capability
is actually built into the Ember.Object class on top of two methods
defined in this mixin: `addObserver` and `removeObserver`. You can use
@ -7753,12 +7758,12 @@ var get = Ember.get, set = Ember.set;
This will call the `targetAction` method on the `targetObject` to be called
whenever the value of the `propertyKey` changes.
Note that if `propertyKey` is a computed property, the observer will be
called when any of the property dependencies are changed, even if the
Note that if `propertyKey` is a computed property, the observer will be
called when any of the property dependencies are changed, even if the
resulting value of the computed property is unchanged. This is necessary
because computed properties are not computed until `get` is called.
@extends Ember.Mixin
*/
Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
@ -7772,7 +7777,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
This method is usually similar to using object[keyName] or object.keyName,
however it supports both computed properties and the unknownProperty
handler.
Because `get` unifies the syntax for accessing all these kinds
of properties, it can make many refactorings easier, such as replacing a
simple property with a computed property, or vice versa.
@ -7968,11 +7973,11 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
Ember.propertyDidChange(this, keyName);
return this;
},
/**
Convenience method to call `propertyWillChange` and `propertyDidChange` in
succession.
@param {String} keyName The property key to be notified about.
@returns {Ember.Observable}
*/
@ -8064,7 +8069,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
This method will be called when a client attempts to get the value of a
property that has not been defined in one of the typical ways. Override
this method to create "virtual" properties.
@param {String} key The name of the unknown property that was requested.
@returns {Object} The property value or undefined. Default is undefined.
*/
@ -8076,7 +8081,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
This method will be called when a client attempts to set the value of a
property that has not been defined in one of the typical ways. Override
this method to create "virtual" properties.
@param {String} key The name of the unknown property to be set.
@param {Object} value The value the unknown property is to be set to.
*/
@ -8087,7 +8092,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
/**
This is like `get`, but allows you to pass in a dot-separated property
path.
person.getPath('address.zip'); // return the zip
person.getPath('children.firstObject.age'); // return the first kid's age
@ -8103,7 +8108,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
/**
This is like `set`, but allows you to specify the property you want to
set as a dot-separated property path.
person.setPath('address.zip', 10011); // set the zip to 10011
person.setPath('children.firstObject.age', 6); // set the first kid's age to 6
@ -8121,9 +8126,9 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
/**
Retrieves the value of a property, or a default value in the case that the property
returns undefined.
person.getWithDefault('lastName', 'Doe');
@param {String} keyName The name of the property to retrieve
@param {Object} defaultValue The value to return if the property value is undefined
@returns {Object} The property value or the defaultValue.
@ -8134,10 +8139,10 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
/**
Set the value of a property to the current value plus some amount.
person.incrementProperty('age');
team.incrementProperty('score', 2);
@param {String} keyName The name of the property to increment
@param {Object} increment The amount to increment by. Defaults to 1
@returns {Object} The new property value
@ -8147,13 +8152,13 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
set(this, keyName, (get(this, keyName) || 0)+increment);
return get(this, keyName);
},
/**
Set the value of a property to the current value minus some amount.
player.decrementProperty('lives');
orc.decrementProperty('health', 5);
@param {String} keyName The name of the property to decrement
@param {Object} increment The amount to decrement by. Defaults to 1
@returns {Object} The new property value
@ -8167,9 +8172,9 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
/**
Set the value of a boolean property to the opposite of it's
current value.
starship.toggleProperty('warpDriveEnaged');
@param {String} keyName The name of the property to toggle
@returns {Object} The new property value
*/
@ -8260,7 +8265,13 @@ function xform(target, method, params) {
method.apply(target, args);
}
Ember.Evented = Ember.Mixin.create({
/**
@class
@extends Ember.Mixin
*/
Ember.Evented = Ember.Mixin.create(
/** @scope Ember.Evented.prototype */ {
on: function(name, target, method) {
if (!method) {
method = target;
@ -8483,7 +8494,7 @@ if (Ember.config.overridePrototypeMixin) {
CoreObject.__super__ = null;
var ClassMixin = Ember.Mixin.create(
/** @scope Ember.CoreObject */ {
/** @scope Ember.ClassMixin.prototype */ {
ClassMixin: Ember.required(),
@ -9969,7 +9980,14 @@ Ember.Controller = Ember.Object.extend(Ember.ControllerMixin);
(function() {
var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach;
Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable, {
/**
@class
@extends Ember.Mixin
@extends Ember.MutableEnumerable
*/
Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable,
/** @scope Ember.Observable.prototype */ {
sortProperties: null,
sortAscending: true,
@ -10451,7 +10469,7 @@ Ember.Application.registerInjection({
injection: function(app, router, property) {
if (!/^[A-Z].*Controller$/.test(property)) { return; }
var name = property[0].toLowerCase() + property.substr(1),
var name = property.charAt(0).toLowerCase() + property.substr(1),
controller = app[property].create();
router.set(name, controller);
@ -11585,7 +11603,7 @@ var invokeForState = {
`Ember.View` is the class in Ember responsible for encapsulating templates of HTML
content, combining templates with data to render as sections of a page's DOM, and
registering and responding to user-initiated events.
## HTML Tag
The default HTML tag name used for a view's DOM representation is `div`. This can be
customized by setting the `tagName` property. The following view class:
@ -11611,7 +11629,7 @@ var invokeForState = {
<div id="ember1" class="ember-view my-class my-other-class"></div>
`class` attribute values can also be set by providing a `classNameBindings` property
set to an array of properties names for the view. The return value of these properties
set to an array of properties names for the view. The return value of these properties
will be added as part of the value for the view's `class` attribute. These properties
can be computed properties:
@ -11640,7 +11658,7 @@ var invokeForState = {
<div id="ember1" class="ember-view hovered"></div>
When using boolean class name bindings you can supply a string value other than the
When using boolean class name bindings you can supply a string value other than the
property name for use as the `class` HTML attribute by appending the preferred value after
a ":" character when defining the binding:
@ -11681,11 +11699,11 @@ var invokeForState = {
<div id="ember1" class="ember-view empty"></div>
Updates to the the value of a class name binding will result in automatic update
Updates to the the value of a class name binding will result in automatic update
of the HTML `class` attribute in the view's rendered HTML representation.
If the value becomes `false` or `undefined` the class name will be removed.
Both `classNames` and `classNameBindings` are concatenated properties.
Both `classNames` and `classNameBindings` are concatenated properties.
See `Ember.Object` documentation for more information about concatenated properties.
## HTML Attributes
@ -11731,7 +11749,7 @@ var invokeForState = {
}.property()
})
Updates to the the property of an attribute binding will result in automatic update
Updates to the the property of an attribute binding will result in automatic update
of the HTML attribute in the view's rendered HTML representation.
`attributeBindings` is a concatenated property. See `Ember.Object` documentation
@ -11822,7 +11840,7 @@ var invokeForState = {
primary templates, layouts can be any function that accepts an optional context
parameter and returns a string of HTML that will be inserted inside view's tag. Views whose HTML
element is self closing (e.g. `<input />`) cannot have a layout and this property will be ignored.
Most typically in Ember a layout will be a compiled Ember.Handlebars template.
A view's layout can be set directly with the `layout` property or reference an
@ -11847,7 +11865,7 @@ var invokeForState = {
See `Handlebars.helpers.yield` for more information.
## Responding to Browser Events
Views can respond to user-initiated events in one of three ways: method implementation,
Views can respond to user-initiated events in one of three ways: method implementation,
through an event manager, and through `{{action}}` helper use in their template or layout.
### Method Implementation
@ -11864,8 +11882,8 @@ var invokeForState = {
### Event Managers
Views can define an object as their `eventManager` property. This object can then
implement methods that match the desired event names. Matching events that occur
on the view's rendered HTML or the rendered HTML of any of its DOM descendants
will trigger this method. A `jQuery.Event` object will be passed as the first
on the view's rendered HTML or the rendered HTML of any of its DOM descendants
will trigger this method. A `jQuery.Event` object will be passed as the first
argument to the method and an `Ember.View` object as the second. The `Ember.View`
will be the view whose rendered HTML was interacted with. This may be the view with
the `eventManager` property or one of its descendent views.
@ -11899,7 +11917,7 @@ var invokeForState = {
Similarly a view's event manager will take precedence for events of any views
rendered as a descendent. A method name that matches an event name will not be called
if the view instance was rendered inside the HTML representation of a view that has
if the view instance was rendered inside the HTML representation of a view that has
an `eventManager` property defined that handles events of the name. Events not handled
by the event manager will still trigger method calls on the descendent.
@ -11921,7 +11939,7 @@ var invokeForState = {
// eventManager doesn't handle click events
},
mouseEnter: function(event){
// will never be called if rendered inside
// will never be called if rendered inside
// an OuterView.
}
})
@ -11942,12 +11960,13 @@ var invokeForState = {
Form events: 'submit', 'change', 'focusIn', 'focusOut', 'input'
HTML5 drag and drop events: 'dragStart', 'drag', 'dragEnter', 'dragLeave', 'drop', 'dragEnd'
## Handlebars `{{view}}` Helper
Other `Ember.View` instances can be included as part of a view's template by using the `{{view}}`
Handlebars helper. See `Handlebars.helpers.view` for additional information.
@extends Ember.Object
@extends Ember.Evented
*/
Ember.View = Ember.Object.extend(Ember.Evented,
/** @scope Ember.View.prototype */ {
@ -14319,7 +14338,7 @@ var get = Ember.get, set = Ember.set, fmt = Ember.String.fmt;
@class
`Ember.CollectionView` is an `Ember.View` descendent responsible for managing a
collection (an array or array-like object) by maintaing a child view object and
collection (an array or array-like object) by maintaing a child view object and
associated DOM representation for each item in the array and ensuring that child
views and their associated rendered HTML are updated when items in the array
are added, removed, or replaced.
@ -14363,7 +14382,7 @@ var get = Ember.get, set = Ember.set, fmt = Ember.String.fmt;
## Automatic matching of parent/child tagNames
Setting the `tagName` property of a `CollectionView` to any of
Setting the `tagName` property of a `CollectionView` to any of
"ul", "ol", "table", "thead", "tbody", "tfoot", "tr", or "select" will result
in the item views receiving an appropriately matched `tagName` property.
@ -14649,6 +14668,8 @@ var get = Ember.get, set = Ember.set, getPath = Ember.getPath;
/**
@class
@extends Ember.Object
*/
Ember.State = Ember.Object.extend(Ember.Evented,
/** @scope Ember.State.prototype */{
@ -14657,7 +14678,7 @@ Ember.State = Ember.Object.extend(Ember.Evented,
/**
A reference to the parent state.
@type {Ember.State}
@type Ember.State
*/
parentState: null,
start: null,
@ -15208,15 +15229,15 @@ var arrayForEach = Ember.ArrayPolyfills.forEach;
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:
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){
@ -15297,7 +15318,7 @@ Ember.StateManager = Ember.State.extend(
@default true
*/
errorOnUnhandledEvent: true,
send: function(event, context) {
Ember.assert('Cannot send event "' + event + '" while currentState is ' + get(this, 'currentState'), get(this, 'currentState'));
if (arguments.length === 1) { context = {}; }
@ -15631,7 +15652,7 @@ Ember.Routable = Ember.Mixin.create({
In general, this will update the browser's URL.
*/
updateRoute: function(manager, location) {
if (get(this, 'isLeaf')) {
if (get(this, 'isLeafRoute')) {
var path = this.absoluteRoute(manager);
location.setURL(path);
}
@ -15683,6 +15704,16 @@ Ember.Routable = Ember.Mixin.create({
return typeof get(this, 'route') === 'string';
}).cacheable(),
/**
@private
Determine if this is the last routeable state
*/
isLeafRoute: Ember.computed(function() {
if (get(this, 'isLeaf')) { return true; }
return !get(this, 'childStates').findProperty('isRoutable');
}).cacheable(),
/**
@private
@ -15825,10 +15856,12 @@ Ember.Routable = Ember.Mixin.create({
on the state whose path is `/posts` with the path `/2/comments`.
*/
routePath: function(manager, path) {
if (get(this, 'isLeaf')) { return; }
if (get(this, 'isLeafRoute')) { return; }
var childStates = get(this, 'childStates'), match;
childStates = Ember.A(childStates.filterProperty('isRoutable'));
childStates = childStates.sort(function(a, b) {
var aDynamicSegments = getPath(a, 'routeMatcher.identifiers.length'),
bDynamicSegments = getPath(b, 'routeMatcher.identifiers.length'),
@ -16142,12 +16175,12 @@ var get = Ember.get, getPath = Ember.getPath, set = Ember.set;
}
Within `deserialize` you should use this information to retrieve or create an appropriate context
object for the given url (e.g. by loading from a remote API or accessing the browser's
`localStorage`). This object must be the `return` value for `deserialize` and will be
object for the given URL (e.g. by loading from a remote API or accessing the browser's
`localStorage`). This object must be the `return` value of `deserialize` and will be
passed to the Route's `connectOutlets` and `serialize` methods.
When an application's state is changed from within the application itself, the context provided for
the transiton will be passed and `deserialize` is not called (see 'Transitions Between States').
the transition will be passed and `deserialize` is not called (see 'Transitions Between States').
### Serializing An Object For URLs with Dynamic Segments
When transitioning into a Route whose `route` property contains dynamic segments the Route's
@ -16206,7 +16239,7 @@ var get = Ember.get, getPath = Ember.getPath, set = Ember.set;
App.get('router').send('moveElsewhere');
Will transition the application's state to 'root.bRoute' and trigger an update of the URL to
'#/someOtherLocation
'#/someOtherLocation'.
For URL patterns with dynamic segments a context can be supplied as the second argument to `send`.
The router will match dynamic segments names to keys on this object and fill in the URL with the
@ -16244,7 +16277,7 @@ var get = Ember.get, getPath = Ember.getPath, set = Ember.set;
During application initialization Ember will detect properties of the application ending in 'Controller',
create singleton instances of each class, and assign them as a properties on the router. The property name
will be the UpperCamel name converted to lowerCamel format. These controller classes should be subclasses
of Ember.ObjectController, Ember.ArrayController, or a custom Ember.Object that includes the
of Ember.ObjectController, Ember.ArrayController, Ember.Controller, or a custom Ember.Object that includes the
Ember.ControllerMixin mixin.
App = Ember.Application.create({
@ -16377,13 +16410,19 @@ Ember.Router = Ember.StateManager.extend(
route: function(path) {
set(this, 'isRouting', true);
var routableState;
try {
path = path.replace(/^(?=[^\/])/, "/");
this.send('navigateAway');
this.send('unroutePath', path);
var currentURL = get(this, 'currentState').absoluteRoute(this);
routableState = get(this, 'currentState');
while (routableState && !routableState.get('isRoutable')) {
routableState = get(routableState, 'parentState');
}
var currentURL = routableState ? routableState.absoluteRoute(this) : '';
var rest = path.substr(currentURL.length);
this.send('routePath', rest);
@ -16391,13 +16430,21 @@ Ember.Router = Ember.StateManager.extend(
set(this, 'isRouting', false);
}
get(this, 'currentState').updateRoute(this, get(this, 'location'));
routableState = get(this, 'currentState');
while (routableState && !routableState.get('isRoutable')) {
routableState = get(routableState, 'parentState');
}
if (routableState) {
routableState.updateRoute(this, get(this, 'location'));
}
},
urlFor: function(path, hash) {
var currentState = get(this, 'currentState') || this,
state = this.findStateByPath(currentState, path);
Ember.assert(Ember.String.fmt("Could not find route with path '%@'", [path]), !!state);
Ember.assert("To get a URL for a state, it must have a `route` property.", !!get(state, 'routeMatcher'));
var location = get(this, 'location'),
@ -18349,7 +18396,7 @@ EmberHandlebars.ViewHelper = Ember.Object.create({
Will result in HTML structure:
<body>
<!-- Note: the handlebars template script
<!-- Note: the handlebars template script
also results in a rendered Ember.View
which is the outer <div> here -->
@ -18371,7 +18418,7 @@ EmberHandlebars.ViewHelper = Ember.Object.create({
})
aView.appendTo('body')
Will result in HTML structure:
<div id="ember1" class="ember-view">
@ -18445,7 +18492,7 @@ EmberHandlebars.ViewHelper = Ember.Object.create({
Will result in the following HTML:
<div id="ember1" class="ember-view">
<div id="ember2" class="ember-view a-custom-view-class-as-property">
<div id="ember2" class="ember-view a-custom-view-class-as-property">
hi
</div>
</div>
@ -18605,7 +18652,7 @@ var get = Ember.get, getPath = Ember.Handlebars.getPath, fmt = Ember.String.fmt;
<p class="ember-view greeting">Howdy Mary</p>
<p class="ember-view greeting">Howdy Sara</p>
</div>
@name Handlebars.helpers.collection
@param {String} path
@param {Hash} options
@ -19219,7 +19266,7 @@ var set = Ember.set, get = Ember.get;
/**
@class
Creates an HTML input of type 'checkbox' with HTML related properties
Creates an HTML input of type 'checkbox' with HTML related properties
applied directly to the input.
{{view Ember.Checkbox classNames="applicaton-specific-checkbox"}}
@ -19238,7 +19285,7 @@ var set = Ember.set, get = Ember.get;
through the Ember object or by interacting with its rendered element representation
via the mouse, keyboard, or touch. Updating the value of the checkbox via jQuery will
result in the checked value of the object and its element losing synchronization.
## Layout and LayoutName properties
Because HTML `input` elements are self closing `layout` and `layoutName` properties will
not be applied. See `Ember.View`'s layout section for more information.
@ -19350,7 +19397,7 @@ var get = Ember.get, set = Ember.set;
## Layout and LayoutName properties
Because HTML `input` elements are self closing `layout` and `layoutName` properties will
not be applied. See `Ember.View`'s layout section for more information.
@extends Ember.TextSupport
*/
Ember.TextField = Ember.View.extend(Ember.TextSupport,
@ -19527,7 +19574,7 @@ var get = Ember.get, set = Ember.set;
## Layout and LayoutName properties
Because HTML `textarea` elements do not contain inner HTML the `layout` and `layoutName`
Because HTML `textarea` elements do not contain inner HTML the `layout` and `layoutName`
properties will not be applied. See `Ember.View`'s layout section for more information.
@extends Ember.TextSupport
@ -19616,7 +19663,85 @@ var indexOf = Ember.EnumerableUtils.indexOf, indexesOf = Ember.EnumerableUtils.i
The Ember.Select view class renders a
[select](https://developer.mozilla.org/en/HTML/Element/select) HTML element,
allowing the user to choose from a list of options. The selected option(s)
are updated live in the `selection` property.
are updated live in the `selection` property, while the corresponding value
is updated in the `value` property.
### Using Strings
The simplest version of an Ember.Select takes an array of strings for the options
of a select box and a valueBinding to set the value.
Example:
App.controller = Ember.Object.create({
selected: null,
content: [
"Yehuda",
"Tom"
]
})
{{view Ember.Select
contentBinding="App.controller.content"
valueBinding="App.controller.selected"
}}
Would result in the following HTML:
<select class="ember-select">
<option value="Yehuda">Yehuda</option>
<option value="Tom">Tom</option>
</select>
Selecting Yehuda from the select box will set `App.controller.selected` to "Yehuda"
### Using Objects
An Ember.Select can also take an array of JS or Ember objects.
When using objects you need to supply optionLabelPath and optionValuePath parameters
which will be used to get the label and value for each of the options.
Usually you will bind to either the selection or the value attribute of the select.
Use selectionBinding if you would like to set the whole object as a property on the target.
Use valueBinding if you would like to set just the value.
Example using selectionBinding:
App.controller = Ember.Object.create({
selectedPerson: null,
selectedPersonId: null,
content: [
Ember.Object.create({firstName: "Yehuda", id: 1}),
Ember.Object.create({firstName: "Tom", id: 2})
]
})
{{view Ember.Select
contentBinding="App.controller.content"
optionLabelPath="content.firstName"
optionValuePath="content.id"
selectionBinding="App.controller.selectedPerson"
prompt="Please Select"}}
<select class="ember-select">
<option value>Please Select</option>
<option value="1">Yehuda</option>
<option value="2">Tom</option>
</select>
Selecting Yehuda here will set `App.controller.selectedPerson` to
the Yehuda object.
Example using valueBinding:
{{view Ember.Select
contentBinding="App.controller.content"
optionLabelPath="content.firstName"
optionValuePath="content.id"
valueBinding="App.controller.selectedPersonId"
prompt="Please Select"}}
Selecting Yehuda in this case will set `App.controller.selectedPersonId` to 1.
@extends Ember.View
*/
@ -19987,8 +20112,8 @@ Ember.$(document).ready(
})();
// Version: v0.9.8.1-437-g68d406e
// Last commit: 68d406e (2012-06-25 14:59:55 -0700)
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
(function() {

View File

@ -1952,8 +1952,8 @@ Handlebars.VM = {
Handlebars.template = Handlebars.VM.template;
;
// Version: v0.9.8.1-437-g68d406e
// Last commit: 68d406e (2012-06-25 14:59:55 -0700)
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
(function() {
@ -2090,8 +2090,8 @@ window.ember_deprecateFunc = Ember.deprecateFunc("ember_deprecateFunc is deprec
})();
// Version: v0.9.8.1-437-g68d406e
// Last commit: 68d406e (2012-06-25 14:59:55 -0700)
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
(function() {
@ -2898,7 +2898,7 @@ Ember.isArray = function(obj) {
Ember.makeArray(); => []
Ember.makeArray(null); => []
Ember.makeArray(undefined); => []
Ember.makeArray('lindsay'); => ['lindsay']
Ember.makeArray('lindsay'); => ['lindsay']
Ember.makeArray([1,2,42]); => [1,2,42]
var controller = Ember.ArrayProxy.create({ content: [] });
@ -5600,7 +5600,7 @@ Ember.RunLoop = RunLoop;
call.
Ember.run(function(){
// code to be execute within a RunLoop
// code to be execute within a RunLoop
});
@name run
@ -5638,7 +5638,7 @@ var run = Ember.run;
an lower-level way to use a RunLoop instead of using Ember.run().
Ember.run.begin();
// code to be execute within a RunLoop
// code to be execute within a RunLoop
Ember.run.end();
@ -5654,7 +5654,7 @@ Ember.run.begin = function() {
instead of using Ember.run().
Ember.run.begin();
// code to be execute within a RunLoop
// code to be execute within a RunLoop
Ember.run.end();
@returns {void}
@ -7402,7 +7402,7 @@ Ember.inspect = function(obj) {
/**
Compares two objects, returning true if they are logically equal. This is
a deeper comparison than a simple triple equal. For sets it will compare the
internal objects. For any other object that implements `isEqual()` it will
internal objects. For any other object that implements `isEqual()` it will
respect that method.
Ember.isEqual('hello', 'hello'); => true
@ -7584,7 +7584,7 @@ Ember.String = {
> beta
> gamma
@param {String} str
@param {String} str
The string to split
@returns {String} split string
@ -7593,7 +7593,7 @@ Ember.String = {
/**
Converts a camelized string into all lower case separated by underscores.
'innerHTML'.decamelize() => 'inner_html'
'action_name'.decamelize() => 'action_name'
'css-class-name'.decamelize() => 'css-class-name'
@ -7610,7 +7610,7 @@ Ember.String = {
/**
Replaces underscores or spaces with dashes.
'innerHTML'.dasherize() => 'inner-html'
'action_name'.dasherize() => 'action-name'
'css-class-name'.dasherize() => 'css-class-name'
@ -7777,7 +7777,7 @@ if (Ember.EXTEND_PROTOTYPES) {
/**
The `property` extension of Javascript's Function prototype is available
when Ember.EXTEND_PROTOTYPES is true, which is the default.
when Ember.EXTEND_PROTOTYPES is true, which is the default.
Computed properties allow you to treat a function like a property:
@ -7832,7 +7832,7 @@ if (Ember.EXTEND_PROTOTYPES) {
/**
The `observes` extension of Javascript's Function prototype is available
when Ember.EXTEND_PROTOTYPES is true, which is the default.
when Ember.EXTEND_PROTOTYPES is true, which is the default.
You can observe property changes simply by adding the `observes`
call to the end of your method declarations in classes that you write.
@ -7843,7 +7843,7 @@ if (Ember.EXTEND_PROTOTYPES) {
// Executes whenever the "value" property changes
}.observes('value')
});
@see Ember.Observable
*/
Function.prototype.observes = function() {
@ -7853,7 +7853,7 @@ if (Ember.EXTEND_PROTOTYPES) {
/**
The `observesBefore` extension of Javascript's Function prototype is
available when Ember.EXTEND_PROTOTYPES is true, which is the default.
available when Ember.EXTEND_PROTOTYPES is true, which is the default.
You can get notified when a property changes is about to happen by
by adding the `observesBefore` call to the end of your method
@ -7864,7 +7864,7 @@ if (Ember.EXTEND_PROTOTYPES) {
// Executes whenever the "value" property is about to change
}.observesBefore('value')
});
@see Ember.Observable
*/
Function.prototype.observesBefore = function() {
@ -7972,9 +7972,11 @@ function xform(target, method, params) {
libraries by implementing only methods that mostly correspond to the
JavaScript 1.8 API.
@extends Ember.Mixin
@since Ember 0.9
*/
Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
Ember.Enumerable = Ember.Mixin.create(
/** @scope Ember.Enumerable.prototype */ {
/** @private - compatibility */
isEnumerable: true,
@ -8005,9 +8007,9 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
The default implementation of this method simply looks up the index.
This works great on any Array-like objects.
@param index {Number} the current index of the iteration
@param previousObject {Object} the value returned by the last call to nextObject.
@param context {Object} a context object you can use to maintain state.
@param {Number} index the current index of the iteration
@param {Object} previousObject the value returned by the last call to nextObject.
@param {Object} context a context object you can use to maintain state.
@returns {Object} the next object in the iteration or undefined
*/
nextObject: Ember.required(Function),
@ -8102,7 +8104,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
to give your iterator function access to the current object.
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Object} receiver
*/
forEach: function(callback, target) {
@ -8124,7 +8126,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
/**
Alias for mapProperty
@params key {String} name of the property
@param {String} key name of the property
@returns {Array} The mapped array.
*/
getEach: function(key) {
@ -8167,7 +8169,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
to give your iterator function access to the current object.
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Array} The mapped array.
*/
map: function(callback, target) {
@ -8182,7 +8184,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
Similar to map, this specialized function returns the value of the named
property on all items in the enumeration.
@params key {String} name of the property
@param {String} key name of the property
@returns {Array} The mapped array.
*/
mapProperty: function(key) {
@ -8212,7 +8214,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
to give your iterator function access to the current object.
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Array} A filtered array.
*/
filter: function(callback, target) {
@ -8228,8 +8230,8 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
can pass an optional second argument with the target value. Otherwise
this will match any property that evaluates to true.
@params key {String} the property to test
@param value {String} optional value to test against.
@param {String} key the property to test
@param {String} [value] optional value to test against.
@returns {Array} filtered array
*/
filterProperty: function(key, value) {
@ -8257,7 +8259,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
to give your iterator function access to the current object.
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Object} Found item or null.
*/
find: function(callback, target) {
@ -8283,8 +8285,8 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
This method works much like the more generic find() method.
@params key {String} the property to test
@param value {String} optional value to test against.
@param {String} key the property to test
@param {String} [value] optional value to test against.
@returns {Object} found item or null
*/
findProperty: function(key, value) {
@ -8315,7 +8317,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
if (people.every(isEngineer)) { Paychecks.addBigBonus(); }
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Boolean}
*/
every: function(callback, target) {
@ -8328,8 +8330,8 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
Returns true if the passed property resolves to true for all items in the
enumerable. This method is often simpler/faster than using a callback.
@params key {String} the property to test
@param value {String} optional value to test against.
@param {String} key the property to test
@param {String} [value] optional value to test against.
@returns {Array} filtered array
*/
everyProperty: function(key, value) {
@ -8361,7 +8363,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
if (people.some(isManager)) { Paychecks.addBiggerBonus(); }
@param {Function} callback The callback to execute
@param {Object} target The target object to use
@param {Object} [target] The target object to use
@returns {Array} A filtered array.
*/
some: function(callback, target) {
@ -8374,8 +8376,8 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
Returns true if the passed property resolves to true for any item in the
enumerable. This method is often simpler/faster than using a callback.
@params key {String} the property to test
@param value {String} optional value to test against.
@param {String} key the property to test
@param {String} [value] optional value to test against.
@returns {Boolean} true
*/
someProperty: function(key, value) {
@ -8429,8 +8431,8 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
implements it. This method corresponds to the implementation in
Prototype 1.6.
@param methodName {String} the name of the method
@param args {Object...} optional arguments to pass as well.
@param {String} methodName the name of the method
@param {Object...} args optional arguments to pass as well.
@returns {Array} return values from calling invoke.
*/
invoke: function(methodName) {
@ -8461,9 +8463,9 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
/**
Returns a copy of the array with all null elements removed.
var arr = ["a", null, "c", null];
arr.compact(); => ["a", "c"]
arr.compact(); => ["a", "c"]
@returns {Array} the array without null elements.
*/
@ -8620,7 +8622,7 @@ Ember.Enumerable = Ember.Mixin.create( /** @lends Ember.Enumerable */ {
An enumerable of the objects to be removed or the number of items to
be removed.
@param {Ember.Enumerable|Numbe} adding
@param {Ember.Enumerable|Number} adding
An enumerable of the objects to be added or the number of items to be
added.
@ -9079,6 +9081,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
You should implement the compare() method.
@extends Ember.Mixin
@since Ember 0.9
*/
Ember.Comparable = Ember.Mixin.create( /** @scope Ember.Comparable.prototype */{
@ -9136,6 +9139,7 @@ var get = Ember.get, set = Ember.set;
Note that frozenCopy() will only work if you also implement Ember.Freezable.
@extends Ember.Mixin
@since Ember 0.9
*/
Ember.Copyable = Ember.Mixin.create(
@ -9247,6 +9251,7 @@ var get = Ember.get, set = Ember.set;
Ember.Copyable protocol, which defines a frozenCopy() method that will return
a frozen object, if the object implements this method as well.
@extends Ember.Mixin
@since Ember 0.9
*/
Ember.Freezable = Ember.Mixin.create(
@ -9463,7 +9468,7 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
colors.clear(); => []
colors.length(); => 0
@returns {Ember.Array} An empty Array.
@returns {Ember.Array} An empty Array.
*/
clear: function () {
var len = get(this, 'length');
@ -9657,15 +9662,15 @@ var get = Ember.get, set = Ember.set;
@class
## Overview
This mixin provides properties and property observing functionality, core
features of the Ember object model.
Properties and observers allow one object to observe changes to a
property on another object. This is one of the fundamental ways that
models, controllers and views communicate with each other in an Ember
application.
Any object that has this mixin applied can be used in observer
operations. That includes Ember.Object and most objects you will
interact with as you write your Ember application.
@ -9673,16 +9678,16 @@ var get = Ember.get, set = Ember.set;
Note that you will not generally apply this mixin to classes yourself,
but you will use the features provided by this module frequently, so it
is important to understand how to use it.
## Using get() and set()
Because of Ember's support for bindings and observers, you will always
access properties using the get method, and set properties using the
set method. This allows the observing objects to be notified and
computed properties to be handled properly.
More documentation about `get` and `set` are below.
## Observing Property Changes
You typically observe property changes simply by adding the `observes`
@ -9694,7 +9699,7 @@ var get = Ember.get, set = Ember.set;
// Executes whenever the "value" property changes
}.observes('value')
});
Although this is the most common way to add an observer, this capability
is actually built into the Ember.Object class on top of two methods
defined in this mixin: `addObserver` and `removeObserver`. You can use
@ -9707,12 +9712,12 @@ var get = Ember.get, set = Ember.set;
This will call the `targetAction` method on the `targetObject` to be called
whenever the value of the `propertyKey` changes.
Note that if `propertyKey` is a computed property, the observer will be
called when any of the property dependencies are changed, even if the
Note that if `propertyKey` is a computed property, the observer will be
called when any of the property dependencies are changed, even if the
resulting value of the computed property is unchanged. This is necessary
because computed properties are not computed until `get` is called.
@extends Ember.Mixin
*/
Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
@ -9726,7 +9731,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
This method is usually similar to using object[keyName] or object.keyName,
however it supports both computed properties and the unknownProperty
handler.
Because `get` unifies the syntax for accessing all these kinds
of properties, it can make many refactorings easier, such as replacing a
simple property with a computed property, or vice versa.
@ -9922,11 +9927,11 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
Ember.propertyDidChange(this, keyName);
return this;
},
/**
Convenience method to call `propertyWillChange` and `propertyDidChange` in
succession.
@param {String} keyName The property key to be notified about.
@returns {Ember.Observable}
*/
@ -10018,7 +10023,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
This method will be called when a client attempts to get the value of a
property that has not been defined in one of the typical ways. Override
this method to create "virtual" properties.
@param {String} key The name of the unknown property that was requested.
@returns {Object} The property value or undefined. Default is undefined.
*/
@ -10030,7 +10035,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
This method will be called when a client attempts to set the value of a
property that has not been defined in one of the typical ways. Override
this method to create "virtual" properties.
@param {String} key The name of the unknown property to be set.
@param {Object} value The value the unknown property is to be set to.
*/
@ -10041,7 +10046,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
/**
This is like `get`, but allows you to pass in a dot-separated property
path.
person.getPath('address.zip'); // return the zip
person.getPath('children.firstObject.age'); // return the first kid's age
@ -10057,7 +10062,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
/**
This is like `set`, but allows you to specify the property you want to
set as a dot-separated property path.
person.setPath('address.zip', 10011); // set the zip to 10011
person.setPath('children.firstObject.age', 6); // set the first kid's age to 6
@ -10075,9 +10080,9 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
/**
Retrieves the value of a property, or a default value in the case that the property
returns undefined.
person.getWithDefault('lastName', 'Doe');
@param {String} keyName The name of the property to retrieve
@param {Object} defaultValue The value to return if the property value is undefined
@returns {Object} The property value or the defaultValue.
@ -10088,10 +10093,10 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
/**
Set the value of a property to the current value plus some amount.
person.incrementProperty('age');
team.incrementProperty('score', 2);
@param {String} keyName The name of the property to increment
@param {Object} increment The amount to increment by. Defaults to 1
@returns {Object} The new property value
@ -10101,13 +10106,13 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
set(this, keyName, (get(this, keyName) || 0)+increment);
return get(this, keyName);
},
/**
Set the value of a property to the current value minus some amount.
player.decrementProperty('lives');
orc.decrementProperty('health', 5);
@param {String} keyName The name of the property to decrement
@param {Object} increment The amount to decrement by. Defaults to 1
@returns {Object} The new property value
@ -10121,9 +10126,9 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
/**
Set the value of a boolean property to the opposite of it's
current value.
starship.toggleProperty('warpDriveEnaged');
@param {String} keyName The name of the property to toggle
@returns {Object} The new property value
*/
@ -10214,7 +10219,13 @@ function xform(target, method, params) {
method.apply(target, args);
}
Ember.Evented = Ember.Mixin.create({
/**
@class
@extends Ember.Mixin
*/
Ember.Evented = Ember.Mixin.create(
/** @scope Ember.Evented.prototype */ {
on: function(name, target, method) {
if (!method) {
method = target;
@ -10437,7 +10448,7 @@ if (Ember.config.overridePrototypeMixin) {
CoreObject.__super__ = null;
var ClassMixin = Ember.Mixin.create(
/** @scope Ember.CoreObject */ {
/** @scope Ember.ClassMixin.prototype */ {
ClassMixin: Ember.required(),
@ -11923,7 +11934,14 @@ Ember.Controller = Ember.Object.extend(Ember.ControllerMixin);
(function() {
var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach;
Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable, {
/**
@class
@extends Ember.Mixin
@extends Ember.MutableEnumerable
*/
Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable,
/** @scope Ember.Observable.prototype */ {
sortProperties: null,
sortAscending: true,
@ -12405,7 +12423,7 @@ Ember.Application.registerInjection({
injection: function(app, router, property) {
if (!/^[A-Z].*Controller$/.test(property)) { return; }
var name = property[0].toLowerCase() + property.substr(1),
var name = property.charAt(0).toLowerCase() + property.substr(1),
controller = app[property].create();
router.set(name, controller);
@ -13539,7 +13557,7 @@ var invokeForState = {
`Ember.View` is the class in Ember responsible for encapsulating templates of HTML
content, combining templates with data to render as sections of a page's DOM, and
registering and responding to user-initiated events.
## HTML Tag
The default HTML tag name used for a view's DOM representation is `div`. This can be
customized by setting the `tagName` property. The following view class:
@ -13565,7 +13583,7 @@ var invokeForState = {
<div id="ember1" class="ember-view my-class my-other-class"></div>
`class` attribute values can also be set by providing a `classNameBindings` property
set to an array of properties names for the view. The return value of these properties
set to an array of properties names for the view. The return value of these properties
will be added as part of the value for the view's `class` attribute. These properties
can be computed properties:
@ -13594,7 +13612,7 @@ var invokeForState = {
<div id="ember1" class="ember-view hovered"></div>
When using boolean class name bindings you can supply a string value other than the
When using boolean class name bindings you can supply a string value other than the
property name for use as the `class` HTML attribute by appending the preferred value after
a ":" character when defining the binding:
@ -13635,11 +13653,11 @@ var invokeForState = {
<div id="ember1" class="ember-view empty"></div>
Updates to the the value of a class name binding will result in automatic update
Updates to the the value of a class name binding will result in automatic update
of the HTML `class` attribute in the view's rendered HTML representation.
If the value becomes `false` or `undefined` the class name will be removed.
Both `classNames` and `classNameBindings` are concatenated properties.
Both `classNames` and `classNameBindings` are concatenated properties.
See `Ember.Object` documentation for more information about concatenated properties.
## HTML Attributes
@ -13685,7 +13703,7 @@ var invokeForState = {
}.property()
})
Updates to the the property of an attribute binding will result in automatic update
Updates to the the property of an attribute binding will result in automatic update
of the HTML attribute in the view's rendered HTML representation.
`attributeBindings` is a concatenated property. See `Ember.Object` documentation
@ -13776,7 +13794,7 @@ var invokeForState = {
primary templates, layouts can be any function that accepts an optional context
parameter and returns a string of HTML that will be inserted inside view's tag. Views whose HTML
element is self closing (e.g. `<input />`) cannot have a layout and this property will be ignored.
Most typically in Ember a layout will be a compiled Ember.Handlebars template.
A view's layout can be set directly with the `layout` property or reference an
@ -13801,7 +13819,7 @@ var invokeForState = {
See `Handlebars.helpers.yield` for more information.
## Responding to Browser Events
Views can respond to user-initiated events in one of three ways: method implementation,
Views can respond to user-initiated events in one of three ways: method implementation,
through an event manager, and through `{{action}}` helper use in their template or layout.
### Method Implementation
@ -13818,8 +13836,8 @@ var invokeForState = {
### Event Managers
Views can define an object as their `eventManager` property. This object can then
implement methods that match the desired event names. Matching events that occur
on the view's rendered HTML or the rendered HTML of any of its DOM descendants
will trigger this method. A `jQuery.Event` object will be passed as the first
on the view's rendered HTML or the rendered HTML of any of its DOM descendants
will trigger this method. A `jQuery.Event` object will be passed as the first
argument to the method and an `Ember.View` object as the second. The `Ember.View`
will be the view whose rendered HTML was interacted with. This may be the view with
the `eventManager` property or one of its descendent views.
@ -13853,7 +13871,7 @@ var invokeForState = {
Similarly a view's event manager will take precedence for events of any views
rendered as a descendent. A method name that matches an event name will not be called
if the view instance was rendered inside the HTML representation of a view that has
if the view instance was rendered inside the HTML representation of a view that has
an `eventManager` property defined that handles events of the name. Events not handled
by the event manager will still trigger method calls on the descendent.
@ -13875,7 +13893,7 @@ var invokeForState = {
// eventManager doesn't handle click events
},
mouseEnter: function(event){
// will never be called if rendered inside
// will never be called if rendered inside
// an OuterView.
}
})
@ -13896,12 +13914,13 @@ var invokeForState = {
Form events: 'submit', 'change', 'focusIn', 'focusOut', 'input'
HTML5 drag and drop events: 'dragStart', 'drag', 'dragEnter', 'dragLeave', 'drop', 'dragEnd'
## Handlebars `{{view}}` Helper
Other `Ember.View` instances can be included as part of a view's template by using the `{{view}}`
Handlebars helper. See `Handlebars.helpers.view` for additional information.
@extends Ember.Object
@extends Ember.Evented
*/
Ember.View = Ember.Object.extend(Ember.Evented,
/** @scope Ember.View.prototype */ {
@ -16273,7 +16292,7 @@ var get = Ember.get, set = Ember.set, fmt = Ember.String.fmt;
@class
`Ember.CollectionView` is an `Ember.View` descendent responsible for managing a
collection (an array or array-like object) by maintaing a child view object and
collection (an array or array-like object) by maintaing a child view object and
associated DOM representation for each item in the array and ensuring that child
views and their associated rendered HTML are updated when items in the array
are added, removed, or replaced.
@ -16317,7 +16336,7 @@ var get = Ember.get, set = Ember.set, fmt = Ember.String.fmt;
## Automatic matching of parent/child tagNames
Setting the `tagName` property of a `CollectionView` to any of
Setting the `tagName` property of a `CollectionView` to any of
"ul", "ol", "table", "thead", "tbody", "tfoot", "tr", or "select" will result
in the item views receiving an appropriately matched `tagName` property.
@ -16603,6 +16622,8 @@ var get = Ember.get, set = Ember.set, getPath = Ember.getPath;
/**
@class
@extends Ember.Object
*/
Ember.State = Ember.Object.extend(Ember.Evented,
/** @scope Ember.State.prototype */{
@ -16611,7 +16632,7 @@ Ember.State = Ember.Object.extend(Ember.Evented,
/**
A reference to the parent state.
@type {Ember.State}
@type Ember.State
*/
parentState: null,
start: null,
@ -17162,15 +17183,15 @@ var arrayForEach = Ember.ArrayPolyfills.forEach;
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:
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){
@ -17251,7 +17272,7 @@ Ember.StateManager = Ember.State.extend(
@default true
*/
errorOnUnhandledEvent: true,
send: function(event, context) {
Ember.assert('Cannot send event "' + event + '" while currentState is ' + get(this, 'currentState'), get(this, 'currentState'));
if (arguments.length === 1) { context = {}; }
@ -17585,7 +17606,7 @@ Ember.Routable = Ember.Mixin.create({
In general, this will update the browser's URL.
*/
updateRoute: function(manager, location) {
if (get(this, 'isLeaf')) {
if (get(this, 'isLeafRoute')) {
var path = this.absoluteRoute(manager);
location.setURL(path);
}
@ -17637,6 +17658,16 @@ Ember.Routable = Ember.Mixin.create({
return typeof get(this, 'route') === 'string';
}).cacheable(),
/**
@private
Determine if this is the last routeable state
*/
isLeafRoute: Ember.computed(function() {
if (get(this, 'isLeaf')) { return true; }
return !get(this, 'childStates').findProperty('isRoutable');
}).cacheable(),
/**
@private
@ -17779,10 +17810,12 @@ Ember.Routable = Ember.Mixin.create({
on the state whose path is `/posts` with the path `/2/comments`.
*/
routePath: function(manager, path) {
if (get(this, 'isLeaf')) { return; }
if (get(this, 'isLeafRoute')) { return; }
var childStates = get(this, 'childStates'), match;
childStates = Ember.A(childStates.filterProperty('isRoutable'));
childStates = childStates.sort(function(a, b) {
var aDynamicSegments = getPath(a, 'routeMatcher.identifiers.length'),
bDynamicSegments = getPath(b, 'routeMatcher.identifiers.length'),
@ -18096,12 +18129,12 @@ var get = Ember.get, getPath = Ember.getPath, set = Ember.set;
}
Within `deserialize` you should use this information to retrieve or create an appropriate context
object for the given url (e.g. by loading from a remote API or accessing the browser's
`localStorage`). This object must be the `return` value for `deserialize` and will be
object for the given URL (e.g. by loading from a remote API or accessing the browser's
`localStorage`). This object must be the `return` value of `deserialize` and will be
passed to the Route's `connectOutlets` and `serialize` methods.
When an application's state is changed from within the application itself, the context provided for
the transiton will be passed and `deserialize` is not called (see 'Transitions Between States').
the transition will be passed and `deserialize` is not called (see 'Transitions Between States').
### Serializing An Object For URLs with Dynamic Segments
When transitioning into a Route whose `route` property contains dynamic segments the Route's
@ -18160,7 +18193,7 @@ var get = Ember.get, getPath = Ember.getPath, set = Ember.set;
App.get('router').send('moveElsewhere');
Will transition the application's state to 'root.bRoute' and trigger an update of the URL to
'#/someOtherLocation
'#/someOtherLocation'.
For URL patterns with dynamic segments a context can be supplied as the second argument to `send`.
The router will match dynamic segments names to keys on this object and fill in the URL with the
@ -18198,7 +18231,7 @@ var get = Ember.get, getPath = Ember.getPath, set = Ember.set;
During application initialization Ember will detect properties of the application ending in 'Controller',
create singleton instances of each class, and assign them as a properties on the router. The property name
will be the UpperCamel name converted to lowerCamel format. These controller classes should be subclasses
of Ember.ObjectController, Ember.ArrayController, or a custom Ember.Object that includes the
of Ember.ObjectController, Ember.ArrayController, Ember.Controller, or a custom Ember.Object that includes the
Ember.ControllerMixin mixin.
App = Ember.Application.create({
@ -18331,13 +18364,19 @@ Ember.Router = Ember.StateManager.extend(
route: function(path) {
set(this, 'isRouting', true);
var routableState;
try {
path = path.replace(/^(?=[^\/])/, "/");
this.send('navigateAway');
this.send('unroutePath', path);
var currentURL = get(this, 'currentState').absoluteRoute(this);
routableState = get(this, 'currentState');
while (routableState && !routableState.get('isRoutable')) {
routableState = get(routableState, 'parentState');
}
var currentURL = routableState ? routableState.absoluteRoute(this) : '';
var rest = path.substr(currentURL.length);
this.send('routePath', rest);
@ -18345,13 +18384,21 @@ Ember.Router = Ember.StateManager.extend(
set(this, 'isRouting', false);
}
get(this, 'currentState').updateRoute(this, get(this, 'location'));
routableState = get(this, 'currentState');
while (routableState && !routableState.get('isRoutable')) {
routableState = get(routableState, 'parentState');
}
if (routableState) {
routableState.updateRoute(this, get(this, 'location'));
}
},
urlFor: function(path, hash) {
var currentState = get(this, 'currentState') || this,
state = this.findStateByPath(currentState, path);
Ember.assert(Ember.String.fmt("Could not find route with path '%@'", [path]), !!state);
Ember.assert("To get a URL for a state, it must have a `route` property.", !!get(state, 'routeMatcher'));
var location = get(this, 'location'),
@ -20303,7 +20350,7 @@ EmberHandlebars.ViewHelper = Ember.Object.create({
Will result in HTML structure:
<body>
<!-- Note: the handlebars template script
<!-- Note: the handlebars template script
also results in a rendered Ember.View
which is the outer <div> here -->
@ -20325,7 +20372,7 @@ EmberHandlebars.ViewHelper = Ember.Object.create({
})
aView.appendTo('body')
Will result in HTML structure:
<div id="ember1" class="ember-view">
@ -20399,7 +20446,7 @@ EmberHandlebars.ViewHelper = Ember.Object.create({
Will result in the following HTML:
<div id="ember1" class="ember-view">
<div id="ember2" class="ember-view a-custom-view-class-as-property">
<div id="ember2" class="ember-view a-custom-view-class-as-property">
hi
</div>
</div>
@ -20559,7 +20606,7 @@ var get = Ember.get, getPath = Ember.Handlebars.getPath, fmt = Ember.String.fmt;
<p class="ember-view greeting">Howdy Mary</p>
<p class="ember-view greeting">Howdy Sara</p>
</div>
@name Handlebars.helpers.collection
@param {String} path
@param {Hash} options
@ -21173,7 +21220,7 @@ var set = Ember.set, get = Ember.get;
/**
@class
Creates an HTML input of type 'checkbox' with HTML related properties
Creates an HTML input of type 'checkbox' with HTML related properties
applied directly to the input.
{{view Ember.Checkbox classNames="applicaton-specific-checkbox"}}
@ -21192,7 +21239,7 @@ var set = Ember.set, get = Ember.get;
through the Ember object or by interacting with its rendered element representation
via the mouse, keyboard, or touch. Updating the value of the checkbox via jQuery will
result in the checked value of the object and its element losing synchronization.
## Layout and LayoutName properties
Because HTML `input` elements are self closing `layout` and `layoutName` properties will
not be applied. See `Ember.View`'s layout section for more information.
@ -21304,7 +21351,7 @@ var get = Ember.get, set = Ember.set;
## Layout and LayoutName properties
Because HTML `input` elements are self closing `layout` and `layoutName` properties will
not be applied. See `Ember.View`'s layout section for more information.
@extends Ember.TextSupport
*/
Ember.TextField = Ember.View.extend(Ember.TextSupport,
@ -21481,7 +21528,7 @@ var get = Ember.get, set = Ember.set;
## Layout and LayoutName properties
Because HTML `textarea` elements do not contain inner HTML the `layout` and `layoutName`
Because HTML `textarea` elements do not contain inner HTML the `layout` and `layoutName`
properties will not be applied. See `Ember.View`'s layout section for more information.
@extends Ember.TextSupport
@ -21570,7 +21617,85 @@ var indexOf = Ember.EnumerableUtils.indexOf, indexesOf = Ember.EnumerableUtils.i
The Ember.Select view class renders a
[select](https://developer.mozilla.org/en/HTML/Element/select) HTML element,
allowing the user to choose from a list of options. The selected option(s)
are updated live in the `selection` property.
are updated live in the `selection` property, while the corresponding value
is updated in the `value` property.
### Using Strings
The simplest version of an Ember.Select takes an array of strings for the options
of a select box and a valueBinding to set the value.
Example:
App.controller = Ember.Object.create({
selected: null,
content: [
"Yehuda",
"Tom"
]
})
{{view Ember.Select
contentBinding="App.controller.content"
valueBinding="App.controller.selected"
}}
Would result in the following HTML:
<select class="ember-select">
<option value="Yehuda">Yehuda</option>
<option value="Tom">Tom</option>
</select>
Selecting Yehuda from the select box will set `App.controller.selected` to "Yehuda"
### Using Objects
An Ember.Select can also take an array of JS or Ember objects.
When using objects you need to supply optionLabelPath and optionValuePath parameters
which will be used to get the label and value for each of the options.
Usually you will bind to either the selection or the value attribute of the select.
Use selectionBinding if you would like to set the whole object as a property on the target.
Use valueBinding if you would like to set just the value.
Example using selectionBinding:
App.controller = Ember.Object.create({
selectedPerson: null,
selectedPersonId: null,
content: [
Ember.Object.create({firstName: "Yehuda", id: 1}),
Ember.Object.create({firstName: "Tom", id: 2})
]
})
{{view Ember.Select
contentBinding="App.controller.content"
optionLabelPath="content.firstName"
optionValuePath="content.id"
selectionBinding="App.controller.selectedPerson"
prompt="Please Select"}}
<select class="ember-select">
<option value>Please Select</option>
<option value="1">Yehuda</option>
<option value="2">Tom</option>
</select>
Selecting Yehuda here will set `App.controller.selectedPerson` to
the Yehuda object.
Example using valueBinding:
{{view Ember.Select
contentBinding="App.controller.content"
optionLabelPath="content.firstName"
optionValuePath="content.id"
valueBinding="App.controller.selectedPersonId"
prompt="Please Select"}}
Selecting Yehuda in this case will set `App.controller.selectedPersonId` to 1.
@extends Ember.View
*/
@ -21941,8 +22066,8 @@ Ember.$(document).ready(
})();
// Version: v0.9.8.1-437-g68d406e
// Last commit: 68d406e (2012-06-25 14:59:55 -0700)
// Version: v0.9.8.1-451-g50ee26d
// Last commit: 50ee26d (2012-06-26 18:06:44 -0700)
(function() {