ember-source 1.0.0.rc8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ember-source might be problematic. Click here for more details.
- checksums.yaml +6 -14
- data/VERSION +1 -1
- data/dist/ember-data-deps.js +909 -1597
- data/dist/ember-data-deps.min.js +6 -6
- data/dist/ember-data-deps.prod.js +892 -1591
- data/dist/ember-debug.js +14 -2
- data/dist/ember-runtime.js +909 -113
- data/dist/ember-runtime.min.js +6 -6
- data/dist/ember-runtime.prod.js +892 -108
- data/dist/ember-spade.js +1 -1
- data/dist/ember-template-compiler.js +3 -12
- data/dist/ember-template-compiler.min.js +3 -3
- data/dist/ember-template-compiler.prod.js +0 -9
- data/dist/ember-tests.js +1 -1
- data/dist/ember.js +1302 -1799
- data/dist/ember.min.js +10 -10
- data/dist/ember.prod.js +1260 -1785
- data/lib/ember/version.rb +6 -2
- metadata +6 -14
- data/dist/ember-old-router.js +0 -28808
- data/dist/ember-old-router.min.js +0 -21
- data/dist/ember-old-router.prod.js +0 -28605
- data/dist/ember-params.js +0 -32394
- data/dist/ember-snork.js +0 -32321
- data/dist/ember2.js +0 -32377
- data/dist/ember3.js +0 -32379
data/dist/ember-debug.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
(function() {
|
2
2
|
var Ember = { assert: function() {} };
|
3
|
-
// Version: v1.0.0
|
4
|
-
// Last commit:
|
3
|
+
// Version: v1.0.0
|
4
|
+
// Last commit: e2ea0cf (2013-08-31 23:47:39 -0700)
|
5
5
|
|
6
6
|
|
7
7
|
(function() {
|
@@ -158,6 +158,18 @@ Ember.deprecateFunc = function(message, func) {
|
|
158
158
|
};
|
159
159
|
};
|
160
160
|
|
161
|
+
|
162
|
+
// Inform the developer about the Ember Inspector if not installed.
|
163
|
+
if (!Ember.testing) {
|
164
|
+
if (typeof window !== 'undefined' && window.chrome && window.addEventListener) {
|
165
|
+
window.addEventListener("load", function() {
|
166
|
+
if (document.body && document.body.dataset && !document.body.dataset.emberExtension) {
|
167
|
+
Ember.debug('For more advanced debugging, install the Ember Inspector from https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi');
|
168
|
+
}
|
169
|
+
}, false);
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
161
173
|
})();
|
162
174
|
|
163
175
|
|
data/dist/ember-runtime.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
// Version: v1.0.0
|
2
|
-
// Last commit:
|
1
|
+
// Version: v1.0.0
|
2
|
+
// Last commit: e2ea0cf (2013-08-31 23:47:39 -0700)
|
3
3
|
|
4
4
|
|
5
5
|
(function() {
|
@@ -156,10 +156,22 @@ Ember.deprecateFunc = function(message, func) {
|
|
156
156
|
};
|
157
157
|
};
|
158
158
|
|
159
|
+
|
160
|
+
// Inform the developer about the Ember Inspector if not installed.
|
161
|
+
if (!Ember.testing) {
|
162
|
+
if (typeof window !== 'undefined' && window.chrome && window.addEventListener) {
|
163
|
+
window.addEventListener("load", function() {
|
164
|
+
if (document.body && document.body.dataset && !document.body.dataset.emberExtension) {
|
165
|
+
Ember.debug('For more advanced debugging, install the Ember Inspector from https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi');
|
166
|
+
}
|
167
|
+
}, false);
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
159
171
|
})();
|
160
172
|
|
161
|
-
// Version: v1.0.0
|
162
|
-
// Last commit:
|
173
|
+
// Version: v1.0.0
|
174
|
+
// Last commit: e2ea0cf (2013-08-31 23:47:39 -0700)
|
163
175
|
|
164
176
|
|
165
177
|
(function() {
|
@@ -225,7 +237,7 @@ var define, requireModule;
|
|
225
237
|
|
226
238
|
@class Ember
|
227
239
|
@static
|
228
|
-
@version 1.0.0
|
240
|
+
@version 1.0.0
|
229
241
|
*/
|
230
242
|
|
231
243
|
if ('undefined' === typeof Ember) {
|
@@ -252,10 +264,10 @@ Ember.toString = function() { return "Ember"; };
|
|
252
264
|
/**
|
253
265
|
@property VERSION
|
254
266
|
@type String
|
255
|
-
@default '1.0.0
|
267
|
+
@default '1.0.0'
|
256
268
|
@final
|
257
269
|
*/
|
258
|
-
Ember.VERSION = '1.0.0
|
270
|
+
Ember.VERSION = '1.0.0';
|
259
271
|
|
260
272
|
/**
|
261
273
|
Standard environmental variables. You can define these in a global `ENV`
|
@@ -4601,8 +4613,8 @@ function registerComputedWithProperties(name, macro) {
|
|
4601
4613
|
property is null, an empty string, empty array, or empty function.
|
4602
4614
|
|
4603
4615
|
Note: When using `Ember.computed.empty` to watch an array make sure to
|
4604
|
-
use the `array.length`
|
4605
|
-
|
4616
|
+
use the `array.length` syntax so the computed can subscribe to transitions
|
4617
|
+
from empty to non-empty states.
|
4606
4618
|
|
4607
4619
|
Example
|
4608
4620
|
|
@@ -4610,9 +4622,9 @@ function registerComputedWithProperties(name, macro) {
|
|
4610
4622
|
var ToDoList = Ember.Object.extend({
|
4611
4623
|
done: Ember.computed.empty('todos.length')
|
4612
4624
|
});
|
4613
|
-
var todoList = ToDoList.create({
|
4625
|
+
var todoList = ToDoList.create({todos: ['Unit Test', 'Documentation', 'Release']});
|
4614
4626
|
todoList.get('done'); // false
|
4615
|
-
todoList.get('
|
4627
|
+
todoList.get('todos').clear(); // []
|
4616
4628
|
todoList.get('done'); // true
|
4617
4629
|
```
|
4618
4630
|
|
@@ -5714,7 +5726,7 @@ define("backburner",
|
|
5714
5726
|
clearTimeout(debouncee[2]);
|
5715
5727
|
}
|
5716
5728
|
|
5717
|
-
var timer =
|
5729
|
+
var timer = global.setTimeout(function() {
|
5718
5730
|
if (!immediate) {
|
5719
5731
|
self.run.apply(self, args);
|
5720
5732
|
}
|
@@ -5783,8 +5795,8 @@ define("backburner",
|
|
5783
5795
|
function createAutorun(backburner) {
|
5784
5796
|
backburner.begin();
|
5785
5797
|
autorun = global.setTimeout(function() {
|
5786
|
-
backburner.end();
|
5787
5798
|
autorun = null;
|
5799
|
+
backburner.end();
|
5788
5800
|
});
|
5789
5801
|
}
|
5790
5802
|
|
@@ -7225,19 +7237,19 @@ Ember.mixin = function(obj) {
|
|
7225
7237
|
`Ember.Mixin.extend`.
|
7226
7238
|
|
7227
7239
|
Note that mixins extend a constructor's prototype so arrays and object literals
|
7228
|
-
defined as properties will be shared amongst objects that implement the mixin.
|
7240
|
+
defined as properties will be shared amongst objects that implement the mixin.
|
7229
7241
|
If you want to define an property in a mixin that is not shared, you can define
|
7230
7242
|
it either as a computed property or have it be created on initialization of the object.
|
7231
|
-
|
7243
|
+
|
7232
7244
|
```javascript
|
7233
7245
|
//filters array will be shared amongst any object implementing mixin
|
7234
7246
|
App.Filterable = Ember.Mixin.create({
|
7235
|
-
filters: Ember.A()
|
7247
|
+
filters: Ember.A()
|
7236
7248
|
});
|
7237
7249
|
|
7238
7250
|
//filters will be a separate array for every object implementing the mixin
|
7239
7251
|
App.Filterable = Ember.Mixin.create({
|
7240
|
-
filters: Ember.computed(function(){return Ember.A();})
|
7252
|
+
filters: Ember.computed(function(){return Ember.A();})
|
7241
7253
|
});
|
7242
7254
|
|
7243
7255
|
//filters will be created as a separate array during the object's initialization
|
@@ -7484,6 +7496,22 @@ Ember.aliasMethod = function(methodName) {
|
|
7484
7496
|
//
|
7485
7497
|
|
7486
7498
|
/**
|
7499
|
+
Specify a method that observes property changes.
|
7500
|
+
|
7501
|
+
```javascript
|
7502
|
+
Ember.Object.extend({
|
7503
|
+
valueObserver: Ember.observer(function() {
|
7504
|
+
// Executes whenever the "value" property changes
|
7505
|
+
}, 'value')
|
7506
|
+
});
|
7507
|
+
```
|
7508
|
+
|
7509
|
+
In the future this method may become asynchronous. If you want to ensure
|
7510
|
+
synchronous behavior, use `immediateObserver`.
|
7511
|
+
|
7512
|
+
Also available as `Function.prototype.observes` if prototype extensions are
|
7513
|
+
enabled.
|
7514
|
+
|
7487
7515
|
@method observer
|
7488
7516
|
@for Ember
|
7489
7517
|
@param {Function} func
|
@@ -7496,9 +7524,23 @@ Ember.observer = function(func) {
|
|
7496
7524
|
return func;
|
7497
7525
|
};
|
7498
7526
|
|
7499
|
-
// If observers ever become asynchronous, Ember.immediateObserver
|
7500
|
-
// must remain synchronous.
|
7501
7527
|
/**
|
7528
|
+
Specify a method that observes property changes.
|
7529
|
+
|
7530
|
+
```javascript
|
7531
|
+
Ember.Object.extend({
|
7532
|
+
valueObserver: Ember.immediateObserver(function() {
|
7533
|
+
// Executes whenever the "value" property changes
|
7534
|
+
}, 'value')
|
7535
|
+
});
|
7536
|
+
```
|
7537
|
+
|
7538
|
+
In the future, `Ember.observer` may become asynchronous. In this event,
|
7539
|
+
`Ember.immediateObserver` will maintain the synchronous behavior.
|
7540
|
+
|
7541
|
+
Also available as `Function.prototype.observesImmediately` if prototype extensions are
|
7542
|
+
enabled.
|
7543
|
+
|
7502
7544
|
@method immediateObserver
|
7503
7545
|
@for Ember
|
7504
7546
|
@param {Function} func
|
@@ -7526,24 +7568,31 @@ Ember.immediateObserver = function() {
|
|
7526
7568
|
|
7527
7569
|
```javascript
|
7528
7570
|
App.PersonView = Ember.View.extend({
|
7571
|
+
|
7529
7572
|
friends: [{ name: 'Tom' }, { name: 'Stefan' }, { name: 'Kris' }],
|
7530
|
-
|
7573
|
+
|
7574
|
+
valueWillChange: Ember.beforeObserver(function(obj, keyName) {
|
7531
7575
|
this.changingFrom = obj.get(keyName);
|
7532
|
-
}
|
7533
|
-
|
7576
|
+
}, 'content.value'),
|
7577
|
+
|
7578
|
+
valueDidChange: Ember.observer(function(obj, keyName) {
|
7534
7579
|
// only run if updating a value already in the DOM
|
7535
7580
|
if (this.get('state') === 'inDOM') {
|
7536
|
-
|
7537
|
-
|
7581
|
+
var color = obj.get(keyName) > this.changingFrom ? 'green' : 'red';
|
7582
|
+
// logic
|
7538
7583
|
}
|
7539
|
-
}
|
7540
|
-
|
7584
|
+
}, 'content.value'),
|
7585
|
+
|
7586
|
+
friendsDidChange: Ember.observer(function(obj, keyName) {
|
7541
7587
|
// some logic
|
7542
7588
|
// obj.get(keyName) returns friends array
|
7543
|
-
}
|
7589
|
+
}, 'friends.@each.name')
|
7544
7590
|
});
|
7545
7591
|
```
|
7546
7592
|
|
7593
|
+
Also available as `Function.prototype.observesBefore` if prototype extensions are
|
7594
|
+
enabled.
|
7595
|
+
|
7547
7596
|
@method beforeObserver
|
7548
7597
|
@for Ember
|
7549
7598
|
@param {Function} func
|
@@ -7627,6 +7676,7 @@ define("rsvp/async",
|
|
7627
7676
|
var browserGlobal = (typeof window !== 'undefined') ? window : {};
|
7628
7677
|
var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
|
7629
7678
|
var async;
|
7679
|
+
var local = (typeof global !== 'undefined') ? global : this;
|
7630
7680
|
|
7631
7681
|
// old node
|
7632
7682
|
function useNextTick() {
|
@@ -7677,7 +7727,7 @@ define("rsvp/async",
|
|
7677
7727
|
|
7678
7728
|
function useSetTimeout() {
|
7679
7729
|
return function(callback, arg) {
|
7680
|
-
|
7730
|
+
local.setTimeout(function() {
|
7681
7731
|
callback(arg);
|
7682
7732
|
}, 1);
|
7683
7733
|
};
|
@@ -8216,6 +8266,13 @@ define("rsvp",
|
|
8216
8266
|
})();
|
8217
8267
|
|
8218
8268
|
(function() {
|
8269
|
+
/**
|
8270
|
+
Flag to enable/disable model factory injections (disabled by default)
|
8271
|
+
If model factory injections are enabled, models should not be
|
8272
|
+
accessed globally (only through `container.lookupFactory('model:modelName'))`);
|
8273
|
+
*/
|
8274
|
+
Ember.MODEL_FACTORY_INJECTIONS = false || !!Ember.ENV.MODEL_FACTORY_INJECTIONS;
|
8275
|
+
|
8219
8276
|
define("container",
|
8220
8277
|
[],
|
8221
8278
|
function() {
|
@@ -8494,6 +8551,7 @@ define("container",
|
|
8494
8551
|
|
8495
8552
|
container.unregister('model:user')
|
8496
8553
|
container.lookup('model:user') === undefined //=> true
|
8554
|
+
```
|
8497
8555
|
|
8498
8556
|
@method unregister
|
8499
8557
|
@param {String} fullName
|
@@ -8577,7 +8635,7 @@ define("container",
|
|
8577
8635
|
*/
|
8578
8636
|
makeToString: function(factory, fullName) {
|
8579
8637
|
return factory.toString();
|
8580
|
-
},
|
8638
|
+
},
|
8581
8639
|
|
8582
8640
|
/**
|
8583
8641
|
Given a fullName return a corresponding instance.
|
@@ -8985,6 +9043,7 @@ define("container",
|
|
8985
9043
|
var factory = container.resolve(name);
|
8986
9044
|
var injectedFactory;
|
8987
9045
|
var cache = container.factoryCache;
|
9046
|
+
var type = fullName.split(":")[0];
|
8988
9047
|
|
8989
9048
|
if (!factory) { return; }
|
8990
9049
|
|
@@ -8992,7 +9051,7 @@ define("container",
|
|
8992
9051
|
return cache.get(fullName);
|
8993
9052
|
}
|
8994
9053
|
|
8995
|
-
if (typeof factory.extend !== 'function') {
|
9054
|
+
if (typeof factory.extend !== 'function' || (!Ember.MODEL_FACTORY_INJECTIONS && type === 'model')) {
|
8996
9055
|
// TODO: think about a 'safe' merge style extension
|
8997
9056
|
// for now just fallback to create time injection
|
8998
9057
|
return factory;
|
@@ -10796,6 +10855,9 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
|
|
10796
10855
|
return an enumerable that maps automatically to the named key on the
|
10797
10856
|
member objects.
|
10798
10857
|
|
10858
|
+
If you merely want to watch for any items being added or removed to the array,
|
10859
|
+
use the `[]` property instead of `@each`.
|
10860
|
+
|
10799
10861
|
@property @each
|
10800
10862
|
*/
|
10801
10863
|
'@each': Ember.computed(function() {
|
@@ -10827,7 +10889,7 @@ var get = Ember.get,
|
|
10827
10889
|
eachPropertyPattern = /^(.*)\.@each\.(.*)/,
|
10828
10890
|
doubleEachPropertyPattern = /(.*\.@each){2,}/;
|
10829
10891
|
|
10830
|
-
|
10892
|
+
/*
|
10831
10893
|
Tracks changes to dependent arrays, as well as to properties of items in
|
10832
10894
|
dependent arrays.
|
10833
10895
|
|
@@ -11016,22 +11078,29 @@ DependentArraysObserver.prototype = {
|
|
11016
11078
|
guid = guidFor(dependentArray),
|
11017
11079
|
dependentKey = this.dependentKeysByGuid[guid],
|
11018
11080
|
itemPropertyKeys = this.cp._itemPropertyKeys[dependentKey] || [],
|
11081
|
+
item,
|
11019
11082
|
itemIndex,
|
11083
|
+
sliceIndex,
|
11020
11084
|
observerContexts;
|
11021
11085
|
|
11022
11086
|
observerContexts = this.removeTransformation(dependentKey, index, removedCount);
|
11023
|
-
|
11087
|
+
|
11088
|
+
|
11089
|
+
function removeObservers(propertyKey) {
|
11090
|
+
removeBeforeObserver(item, propertyKey, this, observerContexts[sliceIndex].beforeObserver);
|
11091
|
+
removeObserver(item, propertyKey, this, observerContexts[sliceIndex].observer);
|
11092
|
+
}
|
11093
|
+
|
11094
|
+
for (sliceIndex = removedCount - 1; sliceIndex >= 0; --sliceIndex) {
|
11024
11095
|
itemIndex = index + sliceIndex;
|
11096
|
+
item = dependentArray.objectAt(itemIndex);
|
11025
11097
|
|
11026
|
-
forEach(itemPropertyKeys,
|
11027
|
-
removeBeforeObserver(item, propertyKey, this, observerContexts[sliceIndex].beforeObserver);
|
11028
|
-
removeObserver(item, propertyKey, this, observerContexts[sliceIndex].observer);
|
11029
|
-
}, this);
|
11098
|
+
forEach(itemPropertyKeys, removeObservers, this);
|
11030
11099
|
|
11031
11100
|
changeMeta = createChangeMeta(dependentArray, item, itemIndex, this.instanceMeta.propertyName, this.cp);
|
11032
11101
|
this.setValue( removedItem.call(
|
11033
11102
|
this.instanceMeta.context, this.getValue(), item, changeMeta, this.instanceMeta.sugarMeta));
|
11034
|
-
}
|
11103
|
+
}
|
11035
11104
|
},
|
11036
11105
|
|
11037
11106
|
dependentArrayDidChange: function (dependentArray, index, removedCount, addedCount) {
|
@@ -11045,8 +11114,8 @@ DependentArraysObserver.prototype = {
|
|
11045
11114
|
|
11046
11115
|
forEach(dependentArray.slice(index, index + addedCount), function (item, sliceIndex) {
|
11047
11116
|
if (itemPropertyKeys) {
|
11048
|
-
observerContext =
|
11049
|
-
observerContexts[sliceIndex] =
|
11117
|
+
observerContext =
|
11118
|
+
observerContexts[sliceIndex] =
|
11050
11119
|
this.createPropertyObserverContext(dependentArray, index + sliceIndex, this.trackedArraysByGuid[dependentKey]);
|
11051
11120
|
forEach(itemPropertyKeys, function (propertyKey) {
|
11052
11121
|
addBeforeObserver(item, propertyKey, this, observerContext.beforeObserver);
|
@@ -11063,30 +11132,29 @@ DependentArraysObserver.prototype = {
|
|
11063
11132
|
},
|
11064
11133
|
|
11065
11134
|
itemPropertyWillChange: function (obj, keyName, array, index) {
|
11066
|
-
var
|
11135
|
+
var guid = guidFor(obj);
|
11067
11136
|
|
11068
|
-
if (!this.changedItems[
|
11069
|
-
this.changedItems[
|
11070
|
-
array: array,
|
11137
|
+
if (!this.changedItems[guid]) {
|
11138
|
+
this.changedItems[guid] = {
|
11139
|
+
array: array,
|
11071
11140
|
index: index,
|
11072
11141
|
obj: obj,
|
11073
|
-
|
11074
|
-
previousValue: get(obj, keyName)
|
11142
|
+
previousValues: {}
|
11075
11143
|
};
|
11076
11144
|
}
|
11145
|
+
|
11146
|
+
this.changedItems[guid].previousValues[keyName] = get(obj, keyName);
|
11077
11147
|
},
|
11078
11148
|
|
11079
11149
|
itemPropertyDidChange: function(obj, keyName, array, index) {
|
11080
11150
|
Ember.run.once(this, 'flushChanges');
|
11081
11151
|
},
|
11082
11152
|
|
11083
|
-
// TODO: it probably makes more sense to remove the item during `willChange`
|
11084
|
-
// and add it back (with the new value) during `didChange`
|
11085
11153
|
flushChanges: function() {
|
11086
11154
|
var changedItems = this.changedItems, key, c, changeMeta;
|
11087
11155
|
for (key in changedItems) {
|
11088
11156
|
c = changedItems[key];
|
11089
|
-
changeMeta = createChangeMeta(c.array, c.obj, c.index, this.instanceMeta.propertyName, this.cp, c.
|
11157
|
+
changeMeta = createChangeMeta(c.array, c.obj, c.index, this.instanceMeta.propertyName, this.cp, c.previousValues);
|
11090
11158
|
this.setValue(
|
11091
11159
|
this.callbacks.removedItem.call(this.instanceMeta.context, this.getValue(), c.obj, changeMeta, this.instanceMeta.sugarMeta));
|
11092
11160
|
this.setValue(
|
@@ -11096,18 +11164,19 @@ DependentArraysObserver.prototype = {
|
|
11096
11164
|
}
|
11097
11165
|
};
|
11098
11166
|
|
11099
|
-
function createChangeMeta(dependentArray, item, index, propertyName, property,
|
11167
|
+
function createChangeMeta(dependentArray, item, index, propertyName, property, previousValues) {
|
11100
11168
|
var meta = {
|
11101
11169
|
arrayChanged: dependentArray,
|
11102
11170
|
index: index,
|
11103
11171
|
item: item,
|
11104
11172
|
propertyName: propertyName,
|
11105
|
-
property: property
|
11106
|
-
// previous value is only available for item property changes!
|
11107
|
-
previousValue: previousValue
|
11173
|
+
property: property
|
11108
11174
|
};
|
11109
11175
|
|
11110
|
-
if (
|
11176
|
+
if (previousValues) {
|
11177
|
+
// previous values only available for item property changes
|
11178
|
+
meta.previousValues = previousValues;
|
11179
|
+
}
|
11111
11180
|
|
11112
11181
|
return meta;
|
11113
11182
|
}
|
@@ -11231,7 +11300,9 @@ function ReduceComputedProperty(options) {
|
|
11231
11300
|
|
11232
11301
|
forEach(cp._dependentKeys, function(dependentKey) {
|
11233
11302
|
var dependentArray = get(this, dependentKey);
|
11234
|
-
|
11303
|
+
if (dependentArray) {
|
11304
|
+
addItems.call(this, dependentArray, callbacks, cp, propertyName, meta);
|
11305
|
+
}
|
11235
11306
|
}, this);
|
11236
11307
|
};
|
11237
11308
|
|
@@ -11333,7 +11404,122 @@ ReduceComputedProperty.prototype.property = function () {
|
|
11333
11404
|
return ComputedProperty.prototype.property.apply(this, propertyArgs);
|
11334
11405
|
};
|
11335
11406
|
|
11407
|
+
/**
|
11408
|
+
Creates a computed property which operates on dependent arrays and
|
11409
|
+
is updated with "one at a time" semantics. When items are added or
|
11410
|
+
removed from the dependent array(s) a reduce computed only operates
|
11411
|
+
on the change instead of re-evaluating the entire array.
|
11412
|
+
|
11413
|
+
If there are more than one arguments the first arguments are
|
11414
|
+
considered to be dependent property keys. The last argument is
|
11415
|
+
required to be an options object. The options object can have the
|
11416
|
+
following four properties.
|
11417
|
+
|
11418
|
+
`initialValue` - A value or function that will be used as the initial
|
11419
|
+
value for the computed. If this property is a function the result of calling
|
11420
|
+
the function will be used as the initial value. This property is required.
|
11421
|
+
|
11422
|
+
`initialize` - An optional initialize function. Typically this will be used
|
11423
|
+
to set up state on the instanceMeta object.
|
11424
|
+
|
11425
|
+
`removedItem` - A function that is called each time an element is removed
|
11426
|
+
from the array.
|
11427
|
+
|
11428
|
+
`addedItem` - A function that is called each time an element is added to
|
11429
|
+
the array.
|
11430
|
+
|
11431
|
+
|
11432
|
+
The `initialize` function has the following signature:
|
11433
|
+
|
11434
|
+
```javascript
|
11435
|
+
function (initialValue, changeMeta, instanceMeta)
|
11436
|
+
```
|
11437
|
+
|
11438
|
+
`initialValue` - The value of the `initialValue` property from the
|
11439
|
+
options object.
|
11440
|
+
|
11441
|
+
`changeMeta` - An object which contains meta information about the
|
11442
|
+
computed. It contains the following properties:
|
11443
|
+
|
11444
|
+
- `property` the computed property
|
11445
|
+
- `propertyName` the name of the property on the object
|
11446
|
+
|
11447
|
+
`instanceMeta` - An object that can be used to store meta
|
11448
|
+
information needed for calculating your computed. For example a
|
11449
|
+
unique computed might use this to store the number of times a given
|
11450
|
+
element is found in the dependent array.
|
11451
|
+
|
11452
|
+
|
11453
|
+
The `removedItem` and `addedItem` functions both have the following signature:
|
11454
|
+
|
11455
|
+
```javascript
|
11456
|
+
function (accumulatedValue, item, changeMeta, instanceMeta)
|
11457
|
+
```
|
11458
|
+
|
11459
|
+
`accumulatedValue` - The value returned from the last time
|
11460
|
+
`removedItem` or `addedItem` was called or `initialValue`.
|
11461
|
+
|
11462
|
+
`item` - the element added or removed from the array
|
11463
|
+
|
11464
|
+
`changeMeta` - An object which contains meta information about the
|
11465
|
+
change. It contains the following properties:
|
11466
|
+
|
11467
|
+
- `property` the computed property
|
11468
|
+
- `propertyName` the name of the property on the object
|
11469
|
+
- `index` the index of the added or removed item
|
11470
|
+
- `item` the added or removed item: this is exactly the same as
|
11471
|
+
the second arg
|
11472
|
+
- `arrayChanged` the array that triggered the change. Can be
|
11473
|
+
useful when depending on multiple arrays.
|
11336
11474
|
|
11475
|
+
For property changes triggered on an item property change (when
|
11476
|
+
depKey is something like `someArray.@each.someProperty`),
|
11477
|
+
`changeMeta` will also contain the following property:
|
11478
|
+
|
11479
|
+
- `previousValues` an object whose keys are the properties that changed on
|
11480
|
+
the item, and whose values are the item's previous values.
|
11481
|
+
|
11482
|
+
`previousValues` is important Ember coalesces item property changes via
|
11483
|
+
Ember.run.once. This means that by the time removedItem gets called, item has
|
11484
|
+
the new values, but you may need the previous value (eg for sorting &
|
11485
|
+
filtering).
|
11486
|
+
|
11487
|
+
`instanceMeta` - An object that can be used to store meta
|
11488
|
+
information needed for calculating your computed. For example a
|
11489
|
+
unique computed might use this to store the number of times a given
|
11490
|
+
element is found in the dependent array.
|
11491
|
+
|
11492
|
+
The `removedItem` and `addedItem` functions should return the accumulated
|
11493
|
+
value. It is acceptable to not return anything (ie return undefined)
|
11494
|
+
to invalidate the computation. This is generally not a good idea for
|
11495
|
+
arrayComputed but it's used in eg max and min.
|
11496
|
+
|
11497
|
+
Example
|
11498
|
+
|
11499
|
+
```javascript
|
11500
|
+
Ember.computed.max = function (dependentKey) {
|
11501
|
+
return Ember.reduceComputed.call(null, dependentKey, {
|
11502
|
+
initialValue: -Infinity,
|
11503
|
+
|
11504
|
+
addedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
|
11505
|
+
return Math.max(accumulatedValue, item);
|
11506
|
+
},
|
11507
|
+
|
11508
|
+
removedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
|
11509
|
+
if (item < accumulatedValue) {
|
11510
|
+
return accumulatedValue;
|
11511
|
+
}
|
11512
|
+
}
|
11513
|
+
});
|
11514
|
+
};
|
11515
|
+
```
|
11516
|
+
|
11517
|
+
@method reduceComputed
|
11518
|
+
@for Ember
|
11519
|
+
@param {String} [dependentKeys*]
|
11520
|
+
@param {Object} options
|
11521
|
+
@returns {Ember.ComputedProperty}
|
11522
|
+
*/
|
11337
11523
|
Ember.reduceComputed = function (options) {
|
11338
11524
|
var args;
|
11339
11525
|
|
@@ -11359,7 +11545,6 @@ Ember.reduceComputed = function (options) {
|
|
11359
11545
|
return cp;
|
11360
11546
|
};
|
11361
11547
|
|
11362
|
-
|
11363
11548
|
})();
|
11364
11549
|
|
11365
11550
|
|
@@ -11404,7 +11589,120 @@ ArrayComputedProperty.prototype.resetValue = function (array) {
|
|
11404
11589
|
return array;
|
11405
11590
|
};
|
11406
11591
|
|
11592
|
+
/**
|
11593
|
+
Creates a computed property which operates on dependent arrays and
|
11594
|
+
is updated with "one at a time" semantics. When items are added or
|
11595
|
+
removed from the dependent array(s) an array computed only operates
|
11596
|
+
on the change instead of re-evaluating the entire array. This should
|
11597
|
+
return an array, if you'd like to use "one at a time" semantics and
|
11598
|
+
compute some value other then an array look at
|
11599
|
+
`Ember.reduceComputed`.
|
11600
|
+
|
11601
|
+
If there are more than one arguments the first arguments are
|
11602
|
+
considered to be dependent property keys. The last argument is
|
11603
|
+
required to be an options object. The options object can have the
|
11604
|
+
following three properties.
|
11605
|
+
|
11606
|
+
`initialize` - An optional initialize function. Typically this will be used
|
11607
|
+
to set up state on the instanceMeta object.
|
11608
|
+
|
11609
|
+
`removedItem` - A function that is called each time an element is
|
11610
|
+
removed from the array.
|
11611
|
+
|
11612
|
+
`addedItem` - A function that is called each time an element is
|
11613
|
+
added to the array.
|
11407
11614
|
|
11615
|
+
|
11616
|
+
The `initialize` function has the following signature:
|
11617
|
+
|
11618
|
+
```javascript
|
11619
|
+
function (array, changeMeta, instanceMeta)
|
11620
|
+
```
|
11621
|
+
|
11622
|
+
`array` - The initial value of the arrayComputed, an empty array.
|
11623
|
+
|
11624
|
+
`changeMeta` - An object which contains meta information about the
|
11625
|
+
computed. It contains the following properties:
|
11626
|
+
|
11627
|
+
- `property` the computed property
|
11628
|
+
- `propertyName` the name of the property on the object
|
11629
|
+
|
11630
|
+
`instanceMeta` - An object that can be used to store meta
|
11631
|
+
information needed for calculating your computed. For example a
|
11632
|
+
unique computed might use this to store the number of times a given
|
11633
|
+
element is found in the dependent array.
|
11634
|
+
|
11635
|
+
|
11636
|
+
The `removedItem` and `addedItem` functions both have the following signature:
|
11637
|
+
|
11638
|
+
```javascript
|
11639
|
+
function (accumulatedValue, item, changeMeta, instanceMeta)
|
11640
|
+
```
|
11641
|
+
|
11642
|
+
`accumulatedValue` - The value returned from the last time
|
11643
|
+
`removedItem` or `addedItem` was called or an empty array.
|
11644
|
+
|
11645
|
+
`item` - the element added or removed from the array
|
11646
|
+
|
11647
|
+
`changeMeta` - An object which contains meta information about the
|
11648
|
+
change. It contains the following properties:
|
11649
|
+
|
11650
|
+
- `property` the computed property
|
11651
|
+
- `propertyName` the name of the property on the object
|
11652
|
+
- `index` the index of the added or removed item
|
11653
|
+
- `item` the added or removed item: this is exactly the same as
|
11654
|
+
the second arg
|
11655
|
+
- `arrayChanged` the array that triggered the change. Can be
|
11656
|
+
useful when depending on multiple arrays.
|
11657
|
+
|
11658
|
+
For property changes triggered on an item property change (when
|
11659
|
+
depKey is something like `someArray.@each.someProperty`),
|
11660
|
+
`changeMeta` will also contain the following property:
|
11661
|
+
|
11662
|
+
- `previousValues` an object whose keys are the properties that changed on
|
11663
|
+
the item, and whose values are the item's previous values.
|
11664
|
+
|
11665
|
+
`previousValues` is important Ember coalesces item property changes via
|
11666
|
+
Ember.run.once. This means that by the time removedItem gets called, item has
|
11667
|
+
the new values, but you may need the previous value (eg for sorting &
|
11668
|
+
filtering).
|
11669
|
+
|
11670
|
+
`instanceMeta` - An object that can be used to store meta
|
11671
|
+
information needed for calculating your computed. For example a
|
11672
|
+
unique computed might use this to store the number of times a given
|
11673
|
+
element is found in the dependent array.
|
11674
|
+
|
11675
|
+
The `removedItem` and `addedItem` functions should return the accumulated
|
11676
|
+
value. It is acceptable to not return anything (ie return undefined)
|
11677
|
+
to invalidate the computation. This is generally not a good idea for
|
11678
|
+
arrayComputed but it's used in eg max and min.
|
11679
|
+
|
11680
|
+
Example
|
11681
|
+
|
11682
|
+
```javascript
|
11683
|
+
Ember.computed.map = function(dependentKey, callback) {
|
11684
|
+
var options = {
|
11685
|
+
addedItem: function(array, item, changeMeta, instanceMeta) {
|
11686
|
+
var mapped = callback(item);
|
11687
|
+
array.insertAt(changeMeta.index, mapped);
|
11688
|
+
return array;
|
11689
|
+
},
|
11690
|
+
removedItem: function(array, item, changeMeta, instanceMeta) {
|
11691
|
+
array.removeAt(changeMeta.index, 1);
|
11692
|
+
return array;
|
11693
|
+
}
|
11694
|
+
};
|
11695
|
+
|
11696
|
+
return Ember.arrayComputed(dependentKey, options);
|
11697
|
+
};
|
11698
|
+
```
|
11699
|
+
|
11700
|
+
@method arrayComputed
|
11701
|
+
@for Ember
|
11702
|
+
@param {String} [dependentKeys*]
|
11703
|
+
@param {Object} options
|
11704
|
+
@returns {Ember.ComputedProperty}
|
11705
|
+
*/
|
11408
11706
|
Ember.arrayComputed = function (options) {
|
11409
11707
|
var args;
|
11410
11708
|
|
@@ -11431,12 +11729,45 @@ Ember.arrayComputed = function (options) {
|
|
11431
11729
|
|
11432
11730
|
|
11433
11731
|
(function() {
|
11732
|
+
/**
|
11733
|
+
@module ember
|
11734
|
+
@submodule ember-runtime
|
11735
|
+
*/
|
11736
|
+
|
11434
11737
|
var get = Ember.get,
|
11435
11738
|
set = Ember.set,
|
11739
|
+
guidFor = Ember.guidFor,
|
11740
|
+
merge = Ember.merge,
|
11436
11741
|
a_slice = [].slice,
|
11437
11742
|
forEach = Ember.EnumerableUtils.forEach,
|
11438
11743
|
map = Ember.EnumerableUtils.map;
|
11439
11744
|
|
11745
|
+
/**
|
11746
|
+
A computed property that calculates the maximum value in the
|
11747
|
+
dependent array. This will return `-Infinity` when the dependent
|
11748
|
+
array is empty.
|
11749
|
+
|
11750
|
+
Example
|
11751
|
+
|
11752
|
+
```javascript
|
11753
|
+
App.Person = Ember.Object.extend({
|
11754
|
+
childAges: Ember.computed.mapBy('children', 'age'),
|
11755
|
+
maxChildAge: Ember.computed.max('childAges')
|
11756
|
+
});
|
11757
|
+
|
11758
|
+
var lordByron = App.Person.create({children: []});
|
11759
|
+
lordByron.get('maxChildAge'); // -Infinity
|
11760
|
+
lordByron.get('children').pushObject({name: 'Augusta Ada Byron', age: 7});
|
11761
|
+
lordByron.get('maxChildAge'); // 7
|
11762
|
+
lordByron.get('children').pushObjects([{name: 'Allegra Byron', age: 5}, {name: 'Elizabeth Medora Leigh', age: 8}]);
|
11763
|
+
lordByron.get('maxChildAge'); // 8
|
11764
|
+
```
|
11765
|
+
|
11766
|
+
@method computed.max
|
11767
|
+
@for Ember
|
11768
|
+
@param {String} dependentKey
|
11769
|
+
@return {Ember.ComputedProperty} computes the largest value in the dependentKey's array
|
11770
|
+
*/
|
11440
11771
|
Ember.computed.max = function (dependentKey) {
|
11441
11772
|
return Ember.reduceComputed.call(null, dependentKey, {
|
11442
11773
|
initialValue: -Infinity,
|
@@ -11453,6 +11784,32 @@ Ember.computed.max = function (dependentKey) {
|
|
11453
11784
|
});
|
11454
11785
|
};
|
11455
11786
|
|
11787
|
+
/**
|
11788
|
+
A computed property that calculates the minimum value in the
|
11789
|
+
dependent array. This will return `Infinity` when the dependent
|
11790
|
+
array is empty.
|
11791
|
+
|
11792
|
+
Example
|
11793
|
+
|
11794
|
+
```javascript
|
11795
|
+
App.Person = Ember.Object.extend({
|
11796
|
+
childAges: Ember.computed.mapBy('children', 'age'),
|
11797
|
+
minChildAge: Ember.computed.min('childAges')
|
11798
|
+
});
|
11799
|
+
|
11800
|
+
var lordByron = App.Person.create({children: []});
|
11801
|
+
lordByron.get('minChildAge'); // Infinity
|
11802
|
+
lordByron.get('children').pushObject({name: 'Augusta Ada Byron', age: 7});
|
11803
|
+
lordByron.get('minChildAge'); // 7
|
11804
|
+
lordByron.get('children').pushObjects([{name: 'Allegra Byron', age: 5}, {name: 'Elizabeth Medora Leigh', age: 8}]);
|
11805
|
+
lordByron.get('minChildAge'); // 5
|
11806
|
+
```
|
11807
|
+
|
11808
|
+
@method computed.min
|
11809
|
+
@for Ember
|
11810
|
+
@param {String} dependentKey
|
11811
|
+
@return {Ember.ComputedProperty} computes the smallest value in the dependentKey's array
|
11812
|
+
*/
|
11456
11813
|
Ember.computed.min = function (dependentKey) {
|
11457
11814
|
return Ember.reduceComputed.call(null, dependentKey, {
|
11458
11815
|
initialValue: Infinity,
|
@@ -11469,6 +11826,36 @@ Ember.computed.min = function (dependentKey) {
|
|
11469
11826
|
});
|
11470
11827
|
};
|
11471
11828
|
|
11829
|
+
/**
|
11830
|
+
Returns an array mapped via the callback
|
11831
|
+
|
11832
|
+
The callback method you provide should have the following signature:
|
11833
|
+
|
11834
|
+
```javascript
|
11835
|
+
function(item);
|
11836
|
+
```
|
11837
|
+
|
11838
|
+
- `item` is the current item in the iteration.
|
11839
|
+
|
11840
|
+
Example
|
11841
|
+
|
11842
|
+
```javascript
|
11843
|
+
App.Hampster = Ember.Object.extend({
|
11844
|
+
excitingChores: Ember.computed.map('chores', function(chore) {
|
11845
|
+
return chore.toUpperCase() + '!';
|
11846
|
+
})
|
11847
|
+
});
|
11848
|
+
|
11849
|
+
var hampster = App.Hampster.create({chores: ['cook', 'clean', 'write more unit tests']});
|
11850
|
+
hampster.get('excitingChores'); // ['COOK!', 'CLEAN!', 'WRITE MORE UNIT TESTS!']
|
11851
|
+
```
|
11852
|
+
|
11853
|
+
@method computed.map
|
11854
|
+
@for Ember
|
11855
|
+
@param {String} dependentKey
|
11856
|
+
@param {Function} callback
|
11857
|
+
@return {Ember.ComputedProperty} an array mapped via the callback
|
11858
|
+
*/
|
11472
11859
|
Ember.computed.map = function(dependentKey, callback) {
|
11473
11860
|
var options = {
|
11474
11861
|
addedItem: function(array, item, changeMeta, instanceMeta) {
|
@@ -11485,11 +11872,79 @@ Ember.computed.map = function(dependentKey, callback) {
|
|
11485
11872
|
return Ember.arrayComputed(dependentKey, options);
|
11486
11873
|
};
|
11487
11874
|
|
11488
|
-
|
11875
|
+
/**
|
11876
|
+
Returns an array mapped to the specified key.
|
11877
|
+
|
11878
|
+
Example
|
11879
|
+
|
11880
|
+
```javascript
|
11881
|
+
App.Person = Ember.Object.extend({
|
11882
|
+
childAges: Ember.computed.mapBy('children', 'age'),
|
11883
|
+
minChildAge: Ember.computed.min('childAges')
|
11884
|
+
});
|
11885
|
+
|
11886
|
+
var lordByron = App.Person.create({children: []});
|
11887
|
+
lordByron.get('childAge'); // []
|
11888
|
+
lordByron.get('children').pushObject({name: 'Augusta Ada Byron', age: 7});
|
11889
|
+
lordByron.get('childAge'); // [7]
|
11890
|
+
lordByron.get('children').pushObjects([{name: 'Allegra Byron', age: 5}, {name: 'Elizabeth Medora Leigh', age: 8}]);
|
11891
|
+
lordByron.get('childAge'); // [7, 5, 8]
|
11892
|
+
```
|
11893
|
+
|
11894
|
+
@method computed.mapBy
|
11895
|
+
@for Ember
|
11896
|
+
@param {String} dependentKey
|
11897
|
+
@param {String} propertyKey
|
11898
|
+
@return {Ember.ComputedProperty} an array mapped to the specified key
|
11899
|
+
*/
|
11900
|
+
Ember.computed.mapBy = function(dependentKey, propertyKey) {
|
11489
11901
|
var callback = function(item) { return get(item, propertyKey); };
|
11490
11902
|
return Ember.computed.map(dependentKey + '.@each.' + propertyKey, callback);
|
11491
11903
|
};
|
11492
11904
|
|
11905
|
+
/**
|
11906
|
+
@method computed.mapProperty
|
11907
|
+
@for Ember
|
11908
|
+
@deprecated Use `Ember.computed.mapBy` instead
|
11909
|
+
@param dependentKey
|
11910
|
+
@param propertyKey
|
11911
|
+
*/
|
11912
|
+
Ember.computed.mapProperty = Ember.computed.mapBy;
|
11913
|
+
|
11914
|
+
/**
|
11915
|
+
Filters the array by the callback.
|
11916
|
+
|
11917
|
+
The callback method you provide should have the following signature:
|
11918
|
+
|
11919
|
+
```javascript
|
11920
|
+
function(item);
|
11921
|
+
```
|
11922
|
+
|
11923
|
+
- `item` is the current item in the iteration.
|
11924
|
+
|
11925
|
+
Example
|
11926
|
+
|
11927
|
+
```javascript
|
11928
|
+
App.Hampster = Ember.Object.extend({
|
11929
|
+
remainingChores: Ember.computed.filter('chores', function(chore) {
|
11930
|
+
return !chore.done;
|
11931
|
+
})
|
11932
|
+
});
|
11933
|
+
|
11934
|
+
var hampster = App.Hampster.create({chores: [
|
11935
|
+
{name: 'cook', done: true},
|
11936
|
+
{name: 'clean', done: true},
|
11937
|
+
{name: 'write more unit tests', done: false}
|
11938
|
+
]});
|
11939
|
+
hampster.get('remainingChores'); // [{name: 'write more unit tests', done: false}]
|
11940
|
+
```
|
11941
|
+
|
11942
|
+
@method computed.filter
|
11943
|
+
@for Ember
|
11944
|
+
@param {String} dependentKey
|
11945
|
+
@param {Function} callback
|
11946
|
+
@return {Ember.ComputedProperty} the filtered array
|
11947
|
+
*/
|
11493
11948
|
Ember.computed.filter = function(dependentKey, callback) {
|
11494
11949
|
var options = {
|
11495
11950
|
initialize: function (array, changeMeta, instanceMeta) {
|
@@ -11503,6 +11958,8 @@ Ember.computed.filter = function(dependentKey, callback) {
|
|
11503
11958
|
if (match) {
|
11504
11959
|
array.insertAt(filterIndex, item);
|
11505
11960
|
}
|
11961
|
+
|
11962
|
+
return array;
|
11506
11963
|
},
|
11507
11964
|
|
11508
11965
|
removedItem: function(array, item, changeMeta, instanceMeta) {
|
@@ -11511,13 +11968,40 @@ Ember.computed.filter = function(dependentKey, callback) {
|
|
11511
11968
|
if (filterIndex > -1) {
|
11512
11969
|
array.removeAt(filterIndex);
|
11513
11970
|
}
|
11971
|
+
|
11972
|
+
return array;
|
11514
11973
|
}
|
11515
11974
|
};
|
11516
11975
|
|
11517
11976
|
return Ember.arrayComputed(dependentKey, options);
|
11518
11977
|
};
|
11519
11978
|
|
11520
|
-
|
11979
|
+
/**
|
11980
|
+
Filters the array by the property and value
|
11981
|
+
|
11982
|
+
Example
|
11983
|
+
|
11984
|
+
```javascript
|
11985
|
+
App.Hampster = Ember.Object.extend({
|
11986
|
+
remainingChores: Ember.computed.filterBy('chores', 'done', false)
|
11987
|
+
});
|
11988
|
+
|
11989
|
+
var hampster = App.Hampster.create({chores: [
|
11990
|
+
{name: 'cook', done: true},
|
11991
|
+
{name: 'clean', done: true},
|
11992
|
+
{name: 'write more unit tests', done: false}
|
11993
|
+
]});
|
11994
|
+
hampster.get('remainingChores'); // [{name: 'write more unit tests', done: false}]
|
11995
|
+
```
|
11996
|
+
|
11997
|
+
@method computed.filterBy
|
11998
|
+
@for Ember
|
11999
|
+
@param {String} dependentKey
|
12000
|
+
@param {String} propertyKey
|
12001
|
+
@param {String} value
|
12002
|
+
@return {Ember.ComputedProperty} the filtered array
|
12003
|
+
*/
|
12004
|
+
Ember.computed.filterBy = function(dependentKey, propertyKey, value) {
|
11521
12005
|
var callback;
|
11522
12006
|
|
11523
12007
|
if (arguments.length === 2) {
|
@@ -11533,6 +12017,42 @@ Ember.computed.filterProperty = function(dependentKey, propertyKey, value) {
|
|
11533
12017
|
return Ember.computed.filter(dependentKey + '.@each.' + propertyKey, callback);
|
11534
12018
|
};
|
11535
12019
|
|
12020
|
+
/**
|
12021
|
+
@method computed.filterProperty
|
12022
|
+
@for Ember
|
12023
|
+
@param dependentKey
|
12024
|
+
@param propertyKey
|
12025
|
+
@param value
|
12026
|
+
@deprecated Use `Ember.computed.filterBy` instead
|
12027
|
+
*/
|
12028
|
+
Ember.computed.filterProperty = Ember.computed.filterBy;
|
12029
|
+
|
12030
|
+
/**
|
12031
|
+
A computed property which returns a new array with all the unique
|
12032
|
+
elements from one or more dependent arrays.
|
12033
|
+
|
12034
|
+
Example
|
12035
|
+
|
12036
|
+
```javascript
|
12037
|
+
App.Hampster = Ember.Object.extend({
|
12038
|
+
uniqueFruits: Ember.computed.uniq('fruits')
|
12039
|
+
});
|
12040
|
+
|
12041
|
+
var hampster = App.Hampster.create({fruits: [
|
12042
|
+
'banana',
|
12043
|
+
'grape',
|
12044
|
+
'kale',
|
12045
|
+
'banana'
|
12046
|
+
]});
|
12047
|
+
hampster.get('uniqueFruits'); // ['banana', 'grape', 'kale']
|
12048
|
+
```
|
12049
|
+
|
12050
|
+
@method computed.uniq
|
12051
|
+
@for Ember
|
12052
|
+
@param {String} propertyKey*
|
12053
|
+
@return {Ember.ComputedProperty} computes a new array with all the
|
12054
|
+
unique elements from the dependent array
|
12055
|
+
*/
|
11536
12056
|
Ember.computed.uniq = function() {
|
11537
12057
|
var args = a_slice.call(arguments);
|
11538
12058
|
args.push({
|
@@ -11541,7 +12061,7 @@ Ember.computed.uniq = function() {
|
|
11541
12061
|
},
|
11542
12062
|
|
11543
12063
|
addedItem: function(array, item, changeMeta, instanceMeta) {
|
11544
|
-
var guid =
|
12064
|
+
var guid = guidFor(item);
|
11545
12065
|
|
11546
12066
|
if (!instanceMeta.itemCounts[guid]) {
|
11547
12067
|
instanceMeta.itemCounts[guid] = 1;
|
@@ -11552,7 +12072,7 @@ Ember.computed.uniq = function() {
|
|
11552
12072
|
return array;
|
11553
12073
|
},
|
11554
12074
|
removedItem: function(array, item, _, instanceMeta) {
|
11555
|
-
var guid =
|
12075
|
+
var guid = guidFor(item),
|
11556
12076
|
itemCounts = instanceMeta.itemCounts;
|
11557
12077
|
|
11558
12078
|
if (--itemCounts[guid] === 0) {
|
@@ -11563,12 +12083,44 @@ Ember.computed.uniq = function() {
|
|
11563
12083
|
});
|
11564
12084
|
return Ember.arrayComputed.apply(null, args);
|
11565
12085
|
};
|
12086
|
+
|
12087
|
+
/**
|
12088
|
+
Alias for [Ember.computed.uniq](/api/#method_computed_uniq).
|
12089
|
+
|
12090
|
+
@method computed.union
|
12091
|
+
@for Ember
|
12092
|
+
@param {String} propertyKey*
|
12093
|
+
@return {Ember.ComputedProperty} computes a new array with all the
|
12094
|
+
unique elements from the dependent array
|
12095
|
+
*/
|
11566
12096
|
Ember.computed.union = Ember.computed.uniq;
|
11567
12097
|
|
12098
|
+
/**
|
12099
|
+
A computed property which returns a new array with all the duplicated
|
12100
|
+
elements from two or more dependeny arrays.
|
12101
|
+
|
12102
|
+
Example
|
12103
|
+
|
12104
|
+
```javascript
|
12105
|
+
var obj = Ember.Object.createWithMixins({
|
12106
|
+
adaFriends: ['Charles Babbage', 'John Hobhouse', 'William King', 'Mary Somerville'],
|
12107
|
+
charlesFriends: ['William King', 'Mary Somerville', 'Ada Lovelace', 'George Peacock'],
|
12108
|
+
friendsInCommon: Ember.computed.intersect('adaFriends', 'charlesFriends')
|
12109
|
+
});
|
12110
|
+
|
12111
|
+
obj.get('friendsInCommon'); // ['William King', 'Mary Somerville']
|
12112
|
+
```
|
12113
|
+
|
12114
|
+
@method computed.intersect
|
12115
|
+
@for Ember
|
12116
|
+
@param {String} propertyKey*
|
12117
|
+
@return {Ember.ComputedProperty} computes a new array with all the
|
12118
|
+
duplicated elements from the dependent arrays
|
12119
|
+
*/
|
11568
12120
|
Ember.computed.intersect = function () {
|
11569
12121
|
var getDependentKeyGuids = function (changeMeta) {
|
11570
12122
|
return map(changeMeta.property._dependentKeys, function (dependentKey) {
|
11571
|
-
return
|
12123
|
+
return guidFor(dependentKey);
|
11572
12124
|
});
|
11573
12125
|
};
|
11574
12126
|
|
@@ -11579,9 +12131,9 @@ Ember.computed.intersect = function () {
|
|
11579
12131
|
},
|
11580
12132
|
|
11581
12133
|
addedItem: function(array, item, changeMeta, instanceMeta) {
|
11582
|
-
var itemGuid =
|
12134
|
+
var itemGuid = guidFor(item),
|
11583
12135
|
dependentGuids = getDependentKeyGuids(changeMeta),
|
11584
|
-
dependentGuid =
|
12136
|
+
dependentGuid = guidFor(changeMeta.arrayChanged),
|
11585
12137
|
numberOfDependentArrays = changeMeta.property._dependentKeys.length,
|
11586
12138
|
itemCounts = instanceMeta.itemCounts;
|
11587
12139
|
|
@@ -11590,15 +12142,15 @@ Ember.computed.intersect = function () {
|
|
11590
12142
|
|
11591
12143
|
if (++itemCounts[itemGuid][dependentGuid] === 1 &&
|
11592
12144
|
numberOfDependentArrays === Ember.keys(itemCounts[itemGuid]).length) {
|
11593
|
-
|
12145
|
+
|
11594
12146
|
array.addObject(item);
|
11595
12147
|
}
|
11596
12148
|
return array;
|
11597
12149
|
},
|
11598
12150
|
removedItem: function(array, item, changeMeta, instanceMeta) {
|
11599
|
-
var itemGuid =
|
12151
|
+
var itemGuid = guidFor(item),
|
11600
12152
|
dependentGuids = getDependentKeyGuids(changeMeta),
|
11601
|
-
dependentGuid =
|
12153
|
+
dependentGuid = guidFor(changeMeta.arrayChanged),
|
11602
12154
|
numberOfDependentArrays = changeMeta.property._dependentKeys.length,
|
11603
12155
|
numberOfArraysItemAppearsIn,
|
11604
12156
|
itemCounts = instanceMeta.itemCounts;
|
@@ -11619,6 +12171,34 @@ Ember.computed.intersect = function () {
|
|
11619
12171
|
return Ember.arrayComputed.apply(null, args);
|
11620
12172
|
};
|
11621
12173
|
|
12174
|
+
/**
|
12175
|
+
A computed property which returns a new array with all the
|
12176
|
+
properties from the first dependent array that are not in the second
|
12177
|
+
dependent array.
|
12178
|
+
|
12179
|
+
Example
|
12180
|
+
|
12181
|
+
```javascript
|
12182
|
+
App.Hampster = Ember.Object.extend({
|
12183
|
+
likes: ['banana', 'grape', 'kale'],
|
12184
|
+
wants: Ember.computed.setDiff('likes', 'fruits')
|
12185
|
+
});
|
12186
|
+
|
12187
|
+
var hampster = App.Hampster.create({fruits: [
|
12188
|
+
'grape',
|
12189
|
+
'kale',
|
12190
|
+
]});
|
12191
|
+
hampster.get('wants'); // ['banana']
|
12192
|
+
```
|
12193
|
+
|
12194
|
+
@method computed.setDiff
|
12195
|
+
@for Ember
|
12196
|
+
@param {String} setAProperty
|
12197
|
+
@param {String} setBProperty
|
12198
|
+
@return {Ember.ComputedProperty} computes a new array with all the
|
12199
|
+
items from the first dependent array that are not in the second
|
12200
|
+
dependent array
|
12201
|
+
*/
|
11622
12202
|
Ember.computed.setDiff = function (setAProperty, setBProperty) {
|
11623
12203
|
if (arguments.length !== 2) {
|
11624
12204
|
throw new Error("setDiff requires exactly two dependent arrays.");
|
@@ -11627,7 +12207,7 @@ Ember.computed.setDiff = function (setAProperty, setBProperty) {
|
|
11627
12207
|
addedItem: function (array, item, changeMeta, instanceMeta) {
|
11628
12208
|
var setA = get(this, setAProperty),
|
11629
12209
|
setB = get(this, setBProperty);
|
11630
|
-
|
12210
|
+
|
11631
12211
|
if (changeMeta.arrayChanged === setA) {
|
11632
12212
|
if (!setB.contains(item)) {
|
11633
12213
|
array.addObject(item);
|
@@ -11641,7 +12221,7 @@ Ember.computed.setDiff = function (setAProperty, setBProperty) {
|
|
11641
12221
|
removedItem: function (array, item, changeMeta, instanceMeta) {
|
11642
12222
|
var setA = get(this, setAProperty),
|
11643
12223
|
setB = get(this, setBProperty);
|
11644
|
-
|
12224
|
+
|
11645
12225
|
if (changeMeta.arrayChanged === setB) {
|
11646
12226
|
if (setA.contains(item)) {
|
11647
12227
|
array.addObject(item);
|
@@ -11655,7 +12235,7 @@ Ember.computed.setDiff = function (setAProperty, setBProperty) {
|
|
11655
12235
|
};
|
11656
12236
|
|
11657
12237
|
function binarySearch(array, item, low, high) {
|
11658
|
-
var mid, midItem, res;
|
12238
|
+
var mid, midItem, res, guidMid, guidItem;
|
11659
12239
|
|
11660
12240
|
if (arguments.length < 4) { high = get(array, 'length'); }
|
11661
12241
|
if (arguments.length < 3) { low = 0; }
|
@@ -11667,7 +12247,18 @@ function binarySearch(array, item, low, high) {
|
|
11667
12247
|
mid = low + Math.floor((high - low) / 2);
|
11668
12248
|
midItem = array.objectAt(mid);
|
11669
12249
|
|
12250
|
+
guidMid = _guidFor(midItem);
|
12251
|
+
guidItem = _guidFor(item);
|
12252
|
+
|
12253
|
+
if (guidMid === guidItem) {
|
12254
|
+
return mid;
|
12255
|
+
}
|
12256
|
+
|
11670
12257
|
res = this.order(midItem, item);
|
12258
|
+
if (res === 0) {
|
12259
|
+
res = guidMid < guidItem ? -1 : 1;
|
12260
|
+
}
|
12261
|
+
|
11671
12262
|
|
11672
12263
|
if (res < 0) {
|
11673
12264
|
return this.binarySearch(array, item, mid+1, high);
|
@@ -11676,8 +12267,66 @@ function binarySearch(array, item, low, high) {
|
|
11676
12267
|
}
|
11677
12268
|
|
11678
12269
|
return mid;
|
12270
|
+
|
12271
|
+
function _guidFor(item) {
|
12272
|
+
if (Ember.ObjectProxy.detectInstance(item)) {
|
12273
|
+
return guidFor(get(item, 'content'));
|
12274
|
+
}
|
12275
|
+
return guidFor(item);
|
12276
|
+
}
|
11679
12277
|
}
|
11680
12278
|
|
12279
|
+
/**
|
12280
|
+
A computed property which returns a new array with all the
|
12281
|
+
properties from the first dependent array sorted based on a property
|
12282
|
+
or sort function.
|
12283
|
+
|
12284
|
+
The callback method you provide should have the following signature:
|
12285
|
+
|
12286
|
+
```javascript
|
12287
|
+
function(itemA, itemB);
|
12288
|
+
```
|
12289
|
+
|
12290
|
+
- `itemA` the first item to compare.
|
12291
|
+
- `itemB` the second item to compare.
|
12292
|
+
|
12293
|
+
This function should return `-1` when `itemA` should come before
|
12294
|
+
`itemB`. It should return `1` when `itemA` should come after
|
12295
|
+
`itemB`. If the `itemA` and `itemB` are equal this function should return `0`.
|
12296
|
+
|
12297
|
+
Example
|
12298
|
+
|
12299
|
+
```javascript
|
12300
|
+
var ToDoList = Ember.Object.extend({
|
12301
|
+
todosSorting: ['name'],
|
12302
|
+
sortedTodos: Ember.computed.sort('todos', 'todosSorting'),
|
12303
|
+
priorityTodos: Ember.computed.sort('todos', function(a, b){
|
12304
|
+
if (a.priority > b.priority) {
|
12305
|
+
return 1;
|
12306
|
+
} else if (a.priority < b.priority) {
|
12307
|
+
return -1;
|
12308
|
+
}
|
12309
|
+
return 0;
|
12310
|
+
}),
|
12311
|
+
});
|
12312
|
+
var todoList = ToDoList.create({todos: [
|
12313
|
+
{name: 'Unit Test', priority: 2},
|
12314
|
+
{name: 'Documentation', priority: 3},
|
12315
|
+
{name: 'Release', priority: 1}
|
12316
|
+
]});
|
12317
|
+
|
12318
|
+
todoList.get('sortedTodos'); // [{name:'Documentation', priority:3}, {name:'Release', priority:1}, {name:'Unit Test', priority:2}]
|
12319
|
+
todoList.get('priroityTodos'); // [{name:'Release', priority:1}, {name:'Unit Test', priority:2}, {name:'Documentation', priority:3}]
|
12320
|
+
```
|
12321
|
+
|
12322
|
+
@method computed.sort
|
12323
|
+
@for Ember
|
12324
|
+
@param {String} dependentKey
|
12325
|
+
@param {String or Function} sortDefinition a dependent key to an
|
12326
|
+
array of sort properties or a function to use when sorting
|
12327
|
+
@return {Ember.ComputedProperty} computes a new sorted array based
|
12328
|
+
on the sort property array or callback function
|
12329
|
+
*/
|
11681
12330
|
Ember.computed.sort = function (itemsKey, sortDefinition) {
|
11682
12331
|
Ember.assert("Ember.computed.sort requires two arguments: an array key to sort and either a sort properties key or sort function", arguments.length === 2);
|
11683
12332
|
|
@@ -11765,9 +12414,8 @@ Ember.computed.sort = function (itemsKey, sortDefinition) {
|
|
11765
12414
|
removedItem: function (array, item, changeMeta, instanceMeta) {
|
11766
12415
|
var proxyProperties, index, searchItem;
|
11767
12416
|
|
11768
|
-
if (changeMeta.
|
11769
|
-
proxyProperties = { content: item };
|
11770
|
-
proxyProperties[changeMeta.keyChanged] = changeMeta.previousValue;
|
12417
|
+
if (changeMeta.previousValues) {
|
12418
|
+
proxyProperties = merge({ content: item }, changeMeta.previousValues);
|
11771
12419
|
|
11772
12420
|
searchItem = Ember.ObjectProxy.create(proxyProperties);
|
11773
12421
|
} else {
|
@@ -12191,9 +12839,9 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
|
|
12191
12839
|
Computed properties allow you to treat a function like a property:
|
12192
12840
|
|
12193
12841
|
```javascript
|
12194
|
-
MyApp.
|
12195
|
-
firstName:
|
12196
|
-
lastName:
|
12842
|
+
MyApp.President = Ember.Object.extend({
|
12843
|
+
firstName: '',
|
12844
|
+
lastName: '',
|
12197
12845
|
|
12198
12846
|
fullName: function() {
|
12199
12847
|
return this.get('firstName') + ' ' + this.get('lastName');
|
@@ -12202,7 +12850,12 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
|
|
12202
12850
|
}.property()
|
12203
12851
|
});
|
12204
12852
|
|
12205
|
-
MyApp.
|
12853
|
+
var president = MyApp.President.create({
|
12854
|
+
firstName: "Barack",
|
12855
|
+
lastName: "Obama"
|
12856
|
+
});
|
12857
|
+
|
12858
|
+
president.get('fullName'); // "Barack Obama"
|
12206
12859
|
```
|
12207
12860
|
|
12208
12861
|
Treating a function like a property is useful because they can work with
|
@@ -12214,9 +12867,9 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
|
|
12214
12867
|
about these dependencies like this:
|
12215
12868
|
|
12216
12869
|
```javascript
|
12217
|
-
MyApp.
|
12218
|
-
firstName:
|
12219
|
-
lastName:
|
12870
|
+
MyApp.President = Ember.Object.extend({
|
12871
|
+
firstName: '',
|
12872
|
+
lastName: '',
|
12220
12873
|
|
12221
12874
|
fullName: function() {
|
12222
12875
|
return this.get('firstName') + ' ' + this.get('lastName');
|
@@ -12253,15 +12906,18 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
|
|
12253
12906
|
For example:
|
12254
12907
|
|
12255
12908
|
```javascript
|
12256
|
-
Ember.Object.
|
12909
|
+
Ember.Object.extend({
|
12257
12910
|
valueObserver: function() {
|
12258
12911
|
// Executes whenever the "value" property changes
|
12259
12912
|
}.observes('value')
|
12260
12913
|
});
|
12261
12914
|
```
|
12262
12915
|
|
12263
|
-
|
12264
|
-
|
12916
|
+
In the future this method may become asynchronous. If you want to ensure
|
12917
|
+
synchronous behavior, use `observesImmediately`.
|
12918
|
+
|
12919
|
+
See `Ember.observer`.
|
12920
|
+
|
12265
12921
|
@method observes
|
12266
12922
|
@for Function
|
12267
12923
|
*/
|
@@ -12270,24 +12926,58 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
|
|
12270
12926
|
return this;
|
12271
12927
|
};
|
12272
12928
|
|
12929
|
+
/**
|
12930
|
+
The `observesImmediately` extension of Javascript's Function prototype is
|
12931
|
+
available when `Ember.EXTEND_PROTOTYPES` or
|
12932
|
+
`Ember.EXTEND_PROTOTYPES.Function` is true, which is the default.
|
12933
|
+
|
12934
|
+
You can observe property changes simply by adding the `observesImmediately`
|
12935
|
+
call to the end of your method declarations in classes that you write.
|
12936
|
+
For example:
|
12937
|
+
|
12938
|
+
```javascript
|
12939
|
+
Ember.Object.extend({
|
12940
|
+
valueObserver: function() {
|
12941
|
+
// Executes immediately after the "value" property changes
|
12942
|
+
}.observesImmediately('value')
|
12943
|
+
});
|
12944
|
+
```
|
12945
|
+
|
12946
|
+
In the future, `observes` may become asynchronous. In this event,
|
12947
|
+
`observesImmediately` will maintain the synchronous behavior.
|
12948
|
+
|
12949
|
+
See `Ember.immediateObserver`.
|
12950
|
+
|
12951
|
+
@method observesImmediately
|
12952
|
+
@for Function
|
12953
|
+
*/
|
12954
|
+
Function.prototype.observesImmediately = function() {
|
12955
|
+
for (var i=0, l=arguments.length; i<l; i++) {
|
12956
|
+
var arg = arguments[i];
|
12957
|
+
Ember.assert("Immediate observers must observe internal properties only, not properties on other objects.", arg.indexOf('.') === -1);
|
12958
|
+
}
|
12959
|
+
|
12960
|
+
return this.observes.apply(this, arguments);
|
12961
|
+
};
|
12962
|
+
|
12273
12963
|
/**
|
12274
12964
|
The `observesBefore` extension of Javascript's Function prototype is
|
12275
12965
|
available when `Ember.EXTEND_PROTOTYPES` or
|
12276
12966
|
`Ember.EXTEND_PROTOTYPES.Function` is true, which is the default.
|
12277
12967
|
|
12278
|
-
You can get notified when a property
|
12968
|
+
You can get notified when a property change is about to happen by
|
12279
12969
|
by adding the `observesBefore` call to the end of your method
|
12280
12970
|
declarations in classes that you write. For example:
|
12281
12971
|
|
12282
12972
|
```javascript
|
12283
|
-
Ember.Object.
|
12973
|
+
Ember.Object.extend({
|
12284
12974
|
valueObserver: function() {
|
12285
12975
|
// Executes whenever the "value" property is about to change
|
12286
12976
|
}.observesBefore('value')
|
12287
12977
|
});
|
12288
12978
|
```
|
12289
12979
|
|
12290
|
-
See `Ember.
|
12980
|
+
See `Ember.beforeObserver`.
|
12291
12981
|
|
12292
12982
|
@method observesBefore
|
12293
12983
|
@for Function
|
@@ -13730,11 +14420,6 @@ Ember.Evented = Ember.Mixin.create({
|
|
13730
14420
|
Ember.sendEvent(this, name, args);
|
13731
14421
|
},
|
13732
14422
|
|
13733
|
-
fire: function(name) {
|
13734
|
-
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.");
|
13735
|
-
this.trigger.apply(this, arguments);
|
13736
|
-
},
|
13737
|
-
|
13738
14423
|
/**
|
13739
14424
|
Cancels subscription for given name, target, and method.
|
13740
14425
|
|
@@ -13913,6 +14598,121 @@ Ember.ActionHandler = Ember.Mixin.create({
|
|
13913
14598
|
|
13914
14599
|
|
13915
14600
|
|
14601
|
+
(function() {
|
14602
|
+
var set = Ember.set, get = Ember.get,
|
14603
|
+
resolve = Ember.RSVP.resolve,
|
14604
|
+
rethrow = Ember.RSVP.rethrow,
|
14605
|
+
not = Ember.computed.not,
|
14606
|
+
or = Ember.computed.or;
|
14607
|
+
|
14608
|
+
/**
|
14609
|
+
@module ember
|
14610
|
+
@submodule ember-runtime
|
14611
|
+
*/
|
14612
|
+
|
14613
|
+
function installPromise(proxy, promise) {
|
14614
|
+
promise.then(function(value) {
|
14615
|
+
set(proxy, 'isFulfilled', true);
|
14616
|
+
set(proxy, 'content', value);
|
14617
|
+
|
14618
|
+
return value;
|
14619
|
+
}, function(reason) {
|
14620
|
+
set(proxy, 'isRejected', true);
|
14621
|
+
set(proxy, 'reason', reason);
|
14622
|
+
}).fail(rethrow);
|
14623
|
+
}
|
14624
|
+
|
14625
|
+
/**
|
14626
|
+
A low level mixin making ObjectProxy, ObjectController or ArrayController's promise aware.
|
14627
|
+
|
14628
|
+
```javascript
|
14629
|
+
var ObjectPromiseController = Ember.ObjectController.extend(Ember.PromiseProxyMixin);
|
14630
|
+
|
14631
|
+
var controller = ObjectPromiseController.create({
|
14632
|
+
promise: $.getJSON('/some/remote/data.json')
|
14633
|
+
});
|
14634
|
+
|
14635
|
+
controller.then(function(json){
|
14636
|
+
// the json
|
14637
|
+
}, function(reason) {
|
14638
|
+
// the reason why you have no json
|
14639
|
+
});
|
14640
|
+
```
|
14641
|
+
|
14642
|
+
the controller has bindable attributes which
|
14643
|
+
track the promises life cycle
|
14644
|
+
|
14645
|
+
```javascript
|
14646
|
+
controller.get('isPending') //=> true
|
14647
|
+
controller.get('isSettled') //=> false
|
14648
|
+
controller.get('isRejected') //=> false
|
14649
|
+
controller.get('isFulfilled') //=> false
|
14650
|
+
```
|
14651
|
+
|
14652
|
+
When the the $.getJSON completes, and the promise is fulfilled
|
14653
|
+
with json, the life cycle attributes will update accordingly.
|
14654
|
+
|
14655
|
+
```javascript
|
14656
|
+
controller.get('isPending') //=> false
|
14657
|
+
controller.get('isSettled') //=> true
|
14658
|
+
controller.get('isRejected') //=> false
|
14659
|
+
controller.get('isFulfilled') //=> true
|
14660
|
+
```
|
14661
|
+
|
14662
|
+
As the controller is an ObjectController, and the json now its content,
|
14663
|
+
all the json properties will be available directly from the controller.
|
14664
|
+
|
14665
|
+
```javascript
|
14666
|
+
// Assuming the following json:
|
14667
|
+
{
|
14668
|
+
firstName: 'Stefan',
|
14669
|
+
lastName: 'Penner'
|
14670
|
+
}
|
14671
|
+
|
14672
|
+
// both properties will accessible on the controller
|
14673
|
+
controller.get('firstName') //=> 'Stefan'
|
14674
|
+
controller.get('lastName') //=> 'Penner'
|
14675
|
+
```
|
14676
|
+
|
14677
|
+
If the controller is backing a template, the attributes are
|
14678
|
+
bindable from within that template
|
14679
|
+
```handlebars
|
14680
|
+
{{#if isPending}}
|
14681
|
+
loading...
|
14682
|
+
{{else}}
|
14683
|
+
firstName: {{firstName}}
|
14684
|
+
lastName: {{lastName}}
|
14685
|
+
{{/if}}
|
14686
|
+
```
|
14687
|
+
@class Ember.PromiseProxyMixin
|
14688
|
+
*/
|
14689
|
+
Ember.PromiseProxyMixin = Ember.Mixin.create({
|
14690
|
+
reason: null,
|
14691
|
+
isPending: not('isSettled').readOnly(),
|
14692
|
+
isSettled: or('isRejected', 'isFulfilled').readOnly(),
|
14693
|
+
isRejected: false,
|
14694
|
+
isFulfilled: false,
|
14695
|
+
|
14696
|
+
promise: Ember.computed(function(key, promise) {
|
14697
|
+
if (arguments.length === 2) {
|
14698
|
+
promise = resolve(promise);
|
14699
|
+
installPromise(this, promise);
|
14700
|
+
return promise;
|
14701
|
+
} else {
|
14702
|
+
throw new Error("PromiseProxy's promise must be set");
|
14703
|
+
}
|
14704
|
+
}),
|
14705
|
+
|
14706
|
+
then: function(fulfill, reject) {
|
14707
|
+
return get(this, 'promise').then(fulfill, reject);
|
14708
|
+
}
|
14709
|
+
});
|
14710
|
+
|
14711
|
+
|
14712
|
+
})();
|
14713
|
+
|
14714
|
+
|
14715
|
+
|
13916
14716
|
(function() {
|
13917
14717
|
|
13918
14718
|
})();
|
@@ -15613,7 +16413,9 @@ var get = Ember.get,
|
|
15613
16413
|
removeBeforeObserver = Ember.removeBeforeObserver,
|
15614
16414
|
removeObserver = Ember.removeObserver,
|
15615
16415
|
propertyWillChange = Ember.propertyWillChange,
|
15616
|
-
propertyDidChange = Ember.propertyDidChange
|
16416
|
+
propertyDidChange = Ember.propertyDidChange,
|
16417
|
+
meta = Ember.meta,
|
16418
|
+
defineProperty = Ember.defineProperty;
|
15617
16419
|
|
15618
16420
|
function contentPropertyWillChange(content, contentKey) {
|
15619
16421
|
var key = contentKey.slice(8); // remove "content."
|
@@ -15731,6 +16533,14 @@ Ember.ObjectProxy = Ember.Object.extend(/** @scope Ember.ObjectProxy.prototype *
|
|
15731
16533
|
},
|
15732
16534
|
|
15733
16535
|
setUnknownProperty: function (key, value) {
|
16536
|
+
var m = meta(this);
|
16537
|
+
if (m.proto === this) {
|
16538
|
+
// if marked as prototype then just defineProperty
|
16539
|
+
// rather than delegate
|
16540
|
+
defineProperty(this, key, null, value);
|
16541
|
+
return value;
|
16542
|
+
}
|
16543
|
+
|
15734
16544
|
var content = get(this, 'content');
|
15735
16545
|
Ember.assert(fmt("Cannot delegate set('%@', %@) to the 'content' property of object proxy %@: its 'content' is undefined.", [key, value, this]), content);
|
15736
16546
|
return set(content, key, value);
|
@@ -15738,25 +16548,6 @@ Ember.ObjectProxy = Ember.Object.extend(/** @scope Ember.ObjectProxy.prototype *
|
|
15738
16548
|
|
15739
16549
|
});
|
15740
16550
|
|
15741
|
-
Ember.ObjectProxy.reopenClass({
|
15742
|
-
create: function () {
|
15743
|
-
var mixin, prototype, i, l, properties, keyName;
|
15744
|
-
if (arguments.length) {
|
15745
|
-
prototype = this.proto();
|
15746
|
-
for (i = 0, l = arguments.length; i < l; i++) {
|
15747
|
-
properties = arguments[i];
|
15748
|
-
for (keyName in properties) {
|
15749
|
-
if (!properties.hasOwnProperty(keyName) || keyName in prototype) { continue; }
|
15750
|
-
if (!mixin) mixin = {};
|
15751
|
-
mixin[keyName] = null;
|
15752
|
-
}
|
15753
|
-
}
|
15754
|
-
if (mixin) this._initMixins([mixin]);
|
15755
|
-
}
|
15756
|
-
return this._super.apply(this, arguments);
|
15757
|
-
}
|
15758
|
-
});
|
15759
|
-
|
15760
16551
|
})();
|
15761
16552
|
|
15762
16553
|
|
@@ -15769,7 +16560,8 @@ Ember.ObjectProxy.reopenClass({
|
|
15769
16560
|
|
15770
16561
|
|
15771
16562
|
var set = Ember.set, get = Ember.get, guidFor = Ember.guidFor;
|
15772
|
-
var forEach = Ember.EnumerableUtils.forEach
|
16563
|
+
var forEach = Ember.EnumerableUtils.forEach,
|
16564
|
+
indexOf = Ember.ArrayPolyfills.indexOf;
|
15773
16565
|
|
15774
16566
|
var EachArray = Ember.Object.extend(Ember.Array, {
|
15775
16567
|
|
@@ -15827,7 +16619,7 @@ function removeObserverForContentKey(content, keyName, proxy, idx, loc) {
|
|
15827
16619
|
|
15828
16620
|
guid = guidFor(item);
|
15829
16621
|
indicies = objects[guid];
|
15830
|
-
indicies[
|
16622
|
+
indicies[indexOf.call(indicies, loc)] = null;
|
15831
16623
|
}
|
15832
16624
|
}
|
15833
16625
|
}
|
@@ -16752,7 +17544,7 @@ Ember.ControllerMixin = Ember.Mixin.create(Ember.ActionHandler, {
|
|
16752
17544
|
deprecatedSend: function(actionName) {
|
16753
17545
|
var args = [].slice.call(arguments, 1);
|
16754
17546
|
Ember.assert('' + this + " has the action " + actionName + " but it is not a function", typeof this[actionName] === 'function');
|
16755
|
-
Ember.deprecate('Action handlers implemented directly on controllers are deprecated in favor of action handlers on an `actions` object', false);
|
17547
|
+
Ember.deprecate('Action handlers implemented directly on controllers are deprecated in favor of action handlers on an `actions` object (' + actionName + ' on ' + this + ')', false);
|
16756
17548
|
this[actionName].apply(this, args);
|
16757
17549
|
return;
|
16758
17550
|
}
|
@@ -17232,11 +18024,15 @@ Ember.ArrayController = Ember.ArrayProxy.extend(Ember.ControllerMixin,
|
|
17232
18024
|
},
|
17233
18025
|
|
17234
18026
|
init: function() {
|
17235
|
-
if (!this.get('content')) { Ember.defineProperty(this, 'content', undefined, Ember.A()); }
|
17236
18027
|
this._super();
|
18028
|
+
|
17237
18029
|
this.set('_subControllers', Ember.A());
|
17238
18030
|
},
|
17239
18031
|
|
18032
|
+
content: Ember.computed(function () {
|
18033
|
+
return Ember.A();
|
18034
|
+
}),
|
18035
|
+
|
17240
18036
|
controllerAt: function(idx, object, controllerClass) {
|
17241
18037
|
var container = get(this, 'container'),
|
17242
18038
|
subControllers = get(this, '_subControllers'),
|