ember-rails 0.9.2 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -0
- data/lib/ember/handlebars/template.rb +2 -2
- data/lib/ember/handlebars/version.rb +1 -1
- data/lib/ember/rails/version.rb +1 -1
- data/lib/ember/version.rb +1 -1
- data/vendor/ember/development/ember.js +1465 -676
- data/vendor/ember/development/handlebars-runtime.js +53 -3
- data/vendor/ember/development/handlebars.js +298 -89
- data/vendor/ember/production/ember.js +1442 -668
- data/vendor/ember/production/handlebars-runtime.js +53 -3
- data/vendor/ember/production/handlebars.js +298 -89
- metadata +4 -4
@@ -55,7 +55,7 @@ var define, requireModule;
|
|
55
55
|
|
56
56
|
@class Ember
|
57
57
|
@static
|
58
|
-
@version 1.0.0-
|
58
|
+
@version 1.0.0-rc.1
|
59
59
|
*/
|
60
60
|
|
61
61
|
if ('undefined' === typeof Ember) {
|
@@ -82,10 +82,10 @@ Ember.toString = function() { return "Ember"; };
|
|
82
82
|
/**
|
83
83
|
@property VERSION
|
84
84
|
@type String
|
85
|
-
@default '1.0.0-
|
85
|
+
@default '1.0.0-rc.1'
|
86
86
|
@final
|
87
87
|
*/
|
88
|
-
Ember.VERSION = '1.0.0-
|
88
|
+
Ember.VERSION = '1.0.0-rc.1';
|
89
89
|
|
90
90
|
/**
|
91
91
|
Standard environmental variables. You can define these in a global `ENV`
|
@@ -155,20 +155,12 @@ Ember.K = function() { return this; };
|
|
155
155
|
|
156
156
|
if ('undefined' === typeof Ember.assert) { Ember.assert = Ember.K; }
|
157
157
|
if ('undefined' === typeof Ember.warn) { Ember.warn = Ember.K; }
|
158
|
+
if ('undefined' === typeof Ember.debug) { Ember.debug = Ember.K; }
|
158
159
|
if ('undefined' === typeof Ember.deprecate) { Ember.deprecate = Ember.K; }
|
159
160
|
if ('undefined' === typeof Ember.deprecateFunc) {
|
160
161
|
Ember.deprecateFunc = function(_, func) { return func; };
|
161
162
|
}
|
162
163
|
|
163
|
-
// These are deprecated but still supported
|
164
|
-
|
165
|
-
if ('undefined' === typeof ember_assert) { exports.ember_assert = Ember.K; }
|
166
|
-
if ('undefined' === typeof ember_warn) { exports.ember_warn = Ember.K; }
|
167
|
-
if ('undefined' === typeof ember_deprecate) { exports.ember_deprecate = Ember.K; }
|
168
|
-
if ('undefined' === typeof ember_deprecateFunc) {
|
169
|
-
exports.ember_deprecateFunc = function(_, func) { return func; };
|
170
|
-
}
|
171
|
-
|
172
164
|
/**
|
173
165
|
Previously we used `Ember.$.uuid`, however `$.uuid` has been removed from
|
174
166
|
jQuery master. We'll just bootstrap our own uuid now.
|
@@ -183,14 +175,36 @@ Ember.uuid = 0;
|
|
183
175
|
// LOGGER
|
184
176
|
//
|
185
177
|
|
178
|
+
function consoleMethod(name) {
|
179
|
+
if (imports.console && imports.console[name]) {
|
180
|
+
// Older IE doesn't support apply, but Chrome needs it
|
181
|
+
if (imports.console[name].apply) {
|
182
|
+
return function() {
|
183
|
+
imports.console[name].apply(imports.console, arguments);
|
184
|
+
};
|
185
|
+
} else {
|
186
|
+
return function() {
|
187
|
+
var message = Array.prototype.join.call(arguments, ', ');
|
188
|
+
imports.console[name](message);
|
189
|
+
};
|
190
|
+
}
|
191
|
+
}
|
192
|
+
}
|
193
|
+
|
186
194
|
/**
|
187
|
-
Inside Ember-Metal, simply uses the `imports.console
|
195
|
+
Inside Ember-Metal, simply uses the methods from `imports.console`.
|
188
196
|
Override this to provide more robust logging functionality.
|
189
197
|
|
190
198
|
@class Logger
|
191
199
|
@namespace Ember
|
192
200
|
*/
|
193
|
-
Ember.Logger =
|
201
|
+
Ember.Logger = {
|
202
|
+
log: consoleMethod('log') || Ember.K,
|
203
|
+
warn: consoleMethod('warn') || Ember.K,
|
204
|
+
error: consoleMethod('error') || Ember.K,
|
205
|
+
info: consoleMethod('info') || Ember.K,
|
206
|
+
debug: consoleMethod('debug') || consoleMethod('info') || Ember.K
|
207
|
+
};
|
194
208
|
|
195
209
|
|
196
210
|
// ..........................................................
|
@@ -1109,8 +1123,63 @@ Ember.subscribe = Ember.Instrumentation.subscribe;
|
|
1109
1123
|
|
1110
1124
|
|
1111
1125
|
(function() {
|
1112
|
-
|
1126
|
+
var utils = Ember.EnumerableUtils = {
|
1127
|
+
map: function(obj, callback, thisArg) {
|
1128
|
+
return obj.map ? obj.map.call(obj, callback, thisArg) : Array.prototype.map.call(obj, callback, thisArg);
|
1129
|
+
},
|
1130
|
+
|
1131
|
+
forEach: function(obj, callback, thisArg) {
|
1132
|
+
return obj.forEach ? obj.forEach.call(obj, callback, thisArg) : Array.prototype.forEach.call(obj, callback, thisArg);
|
1133
|
+
},
|
1134
|
+
|
1135
|
+
indexOf: function(obj, element, index) {
|
1136
|
+
return obj.indexOf ? obj.indexOf.call(obj, element, index) : Array.prototype.indexOf.call(obj, element, index);
|
1137
|
+
},
|
1138
|
+
|
1139
|
+
indexesOf: function(obj, elements) {
|
1140
|
+
return elements === undefined ? [] : utils.map(elements, function(item) {
|
1141
|
+
return utils.indexOf(obj, item);
|
1142
|
+
});
|
1143
|
+
},
|
1144
|
+
|
1145
|
+
addObject: function(array, item) {
|
1146
|
+
var index = utils.indexOf(array, item);
|
1147
|
+
if (index === -1) { array.push(item); }
|
1148
|
+
},
|
1113
1149
|
|
1150
|
+
removeObject: function(array, item) {
|
1151
|
+
var index = utils.indexOf(array, item);
|
1152
|
+
if (index !== -1) { array.splice(index, 1); }
|
1153
|
+
},
|
1154
|
+
|
1155
|
+
replace: function(array, idx, amt, objects) {
|
1156
|
+
if (array.replace) {
|
1157
|
+
return array.replace(idx, amt, objects);
|
1158
|
+
} else {
|
1159
|
+
var args = Array.prototype.concat.apply([idx, amt], objects);
|
1160
|
+
return array.splice.apply(array, args);
|
1161
|
+
}
|
1162
|
+
},
|
1163
|
+
|
1164
|
+
intersection: function(array1, array2) {
|
1165
|
+
var intersection = [];
|
1166
|
+
|
1167
|
+
array1.forEach(function(element) {
|
1168
|
+
if (array2.indexOf(element) >= 0) {
|
1169
|
+
intersection.push(element);
|
1170
|
+
}
|
1171
|
+
});
|
1172
|
+
|
1173
|
+
return intersection;
|
1174
|
+
}
|
1175
|
+
};
|
1176
|
+
|
1177
|
+
})();
|
1178
|
+
|
1179
|
+
|
1180
|
+
|
1181
|
+
(function() {
|
1182
|
+
/*jshint newcap:false*/
|
1114
1183
|
/**
|
1115
1184
|
@module ember-metal
|
1116
1185
|
*/
|
@@ -1188,46 +1257,6 @@ Ember.ArrayPolyfills = {
|
|
1188
1257
|
indexOf: arrayIndexOf
|
1189
1258
|
};
|
1190
1259
|
|
1191
|
-
var utils = Ember.EnumerableUtils = {
|
1192
|
-
map: function(obj, callback, thisArg) {
|
1193
|
-
return obj.map ? obj.map.call(obj, callback, thisArg) : arrayMap.call(obj, callback, thisArg);
|
1194
|
-
},
|
1195
|
-
|
1196
|
-
forEach: function(obj, callback, thisArg) {
|
1197
|
-
return obj.forEach ? obj.forEach.call(obj, callback, thisArg) : arrayForEach.call(obj, callback, thisArg);
|
1198
|
-
},
|
1199
|
-
|
1200
|
-
indexOf: function(obj, element, index) {
|
1201
|
-
return obj.indexOf ? obj.indexOf.call(obj, element, index) : arrayIndexOf.call(obj, element, index);
|
1202
|
-
},
|
1203
|
-
|
1204
|
-
indexesOf: function(obj, elements) {
|
1205
|
-
return elements === undefined ? [] : utils.map(elements, function(item) {
|
1206
|
-
return utils.indexOf(obj, item);
|
1207
|
-
});
|
1208
|
-
},
|
1209
|
-
|
1210
|
-
addObject: function(array, item) {
|
1211
|
-
var index = utils.indexOf(array, item);
|
1212
|
-
if (index === -1) { array.push(item); }
|
1213
|
-
},
|
1214
|
-
|
1215
|
-
removeObject: function(array, item) {
|
1216
|
-
var index = utils.indexOf(array, item);
|
1217
|
-
if (index !== -1) { array.splice(index, 1); }
|
1218
|
-
},
|
1219
|
-
|
1220
|
-
replace: function(array, idx, amt, objects) {
|
1221
|
-
if (array.replace) {
|
1222
|
-
return array.replace(idx, amt, objects);
|
1223
|
-
} else {
|
1224
|
-
var args = Array.prototype.concat.apply([idx, amt], objects);
|
1225
|
-
return array.splice.apply(array, args);
|
1226
|
-
}
|
1227
|
-
}
|
1228
|
-
};
|
1229
|
-
|
1230
|
-
|
1231
1260
|
if (Ember.SHIM_ES5) {
|
1232
1261
|
if (!Array.prototype.map) {
|
1233
1262
|
Array.prototype.map = arrayMap;
|
@@ -1962,6 +1991,17 @@ var Descriptor = Ember.Descriptor = function() {};
|
|
1962
1991
|
// DEFINING PROPERTIES API
|
1963
1992
|
//
|
1964
1993
|
|
1994
|
+
var MANDATORY_SETTER_FUNCTION = Ember.MANDATORY_SETTER_FUNCTION = function(value) {
|
1995
|
+
|
1996
|
+
};
|
1997
|
+
|
1998
|
+
var DEFAULT_GETTER_FUNCTION = Ember.DEFAULT_GETTER_FUNCTION = function(name) {
|
1999
|
+
return function() {
|
2000
|
+
var meta = this[META_KEY];
|
2001
|
+
return meta && meta.values[name];
|
2002
|
+
};
|
2003
|
+
};
|
2004
|
+
|
1965
2005
|
/**
|
1966
2006
|
@private
|
1967
2007
|
|
@@ -2045,13 +2085,8 @@ Ember.defineProperty = function(obj, keyName, desc, data, meta) {
|
|
2045
2085
|
objectDefineProperty(obj, keyName, {
|
2046
2086
|
configurable: true,
|
2047
2087
|
enumerable: true,
|
2048
|
-
set:
|
2049
|
-
|
2050
|
-
},
|
2051
|
-
get: function() {
|
2052
|
-
var meta = this[META_KEY];
|
2053
|
-
return meta && meta.values[keyName];
|
2054
|
-
}
|
2088
|
+
set: MANDATORY_SETTER_FUNCTION,
|
2089
|
+
get: DEFAULT_GETTER_FUNCTION(keyName)
|
2055
2090
|
});
|
2056
2091
|
} else {
|
2057
2092
|
obj[keyName] = data;
|
@@ -2775,13 +2810,8 @@ Ember.watch = function(obj, keyName) {
|
|
2775
2810
|
o_defineProperty(obj, keyName, {
|
2776
2811
|
configurable: true,
|
2777
2812
|
enumerable: true,
|
2778
|
-
set:
|
2779
|
-
|
2780
|
-
},
|
2781
|
-
get: function() {
|
2782
|
-
var meta = this[META_KEY];
|
2783
|
-
return meta && meta.values[keyName];
|
2784
|
-
}
|
2813
|
+
set: Ember.MANDATORY_SETTER_FUNCTION,
|
2814
|
+
get: Ember.DEFAULT_GETTER_FUNCTION(keyName)
|
2785
2815
|
});
|
2786
2816
|
}
|
2787
2817
|
} else {
|
@@ -5693,7 +5723,8 @@ define("rsvp",
|
|
5693
5723
|
callbacks, callbackTuple, callback, binding, event;
|
5694
5724
|
|
5695
5725
|
if (callbacks = allCallbacks[eventName]) {
|
5696
|
-
|
5726
|
+
// Don't cache the callbacks.length since it may grow
|
5727
|
+
for (var i=0; i<callbacks.length; i++) {
|
5697
5728
|
callbackTuple = callbacks[i];
|
5698
5729
|
callback = callbackTuple[0];
|
5699
5730
|
binding = callbackTuple[1];
|
@@ -5811,9 +5842,41 @@ define("rsvp",
|
|
5811
5842
|
});
|
5812
5843
|
}
|
5813
5844
|
|
5845
|
+
function all(promises) {
|
5846
|
+
var i, results = [];
|
5847
|
+
var allPromise = new Promise();
|
5848
|
+
var remaining = promises.length;
|
5849
|
+
|
5850
|
+
if (remaining === 0) {
|
5851
|
+
allPromise.resolve([]);
|
5852
|
+
}
|
5853
|
+
|
5854
|
+
var resolver = function(index) {
|
5855
|
+
return function(value) {
|
5856
|
+
resolve(index, value);
|
5857
|
+
};
|
5858
|
+
};
|
5859
|
+
|
5860
|
+
var resolve = function(index, value) {
|
5861
|
+
results[index] = value;
|
5862
|
+
if (--remaining === 0) {
|
5863
|
+
allPromise.resolve(results);
|
5864
|
+
}
|
5865
|
+
};
|
5866
|
+
|
5867
|
+
var reject = function(error) {
|
5868
|
+
allPromise.reject(error);
|
5869
|
+
};
|
5870
|
+
|
5871
|
+
for (i = 0; i < remaining; i++) {
|
5872
|
+
promises[i].then(resolver(i), reject);
|
5873
|
+
}
|
5874
|
+
return allPromise;
|
5875
|
+
}
|
5876
|
+
|
5814
5877
|
EventTarget.mixin(Promise.prototype);
|
5815
5878
|
|
5816
|
-
RSVP = { async: async, Promise: Promise, Event: Event, EventTarget: EventTarget };
|
5879
|
+
RSVP = { async: async, Promise: Promise, Event: Event, EventTarget: EventTarget, all: all, raiseOnUncaughtExceptions: true };
|
5817
5880
|
return RSVP;
|
5818
5881
|
});
|
5819
5882
|
|
@@ -5884,10 +5947,10 @@ define("container",
|
|
5884
5947
|
this.resolver = parent && parent.resolver || function() {};
|
5885
5948
|
this.registry = new InheritingDict(parent && parent.registry);
|
5886
5949
|
this.cache = new InheritingDict(parent && parent.cache);
|
5887
|
-
this.typeInjections =
|
5950
|
+
this.typeInjections = new InheritingDict(parent && parent.typeInjections);
|
5888
5951
|
this.injections = {};
|
5889
|
-
this.
|
5890
|
-
this.
|
5952
|
+
this._options = new InheritingDict(parent && parent._options);
|
5953
|
+
this._typeOptions = new InheritingDict(parent && parent._typeOptions);
|
5891
5954
|
}
|
5892
5955
|
|
5893
5956
|
Container.prototype = {
|
@@ -5902,8 +5965,20 @@ define("container",
|
|
5902
5965
|
},
|
5903
5966
|
|
5904
5967
|
register: function(type, name, factory, options) {
|
5905
|
-
|
5906
|
-
|
5968
|
+
var fullName;
|
5969
|
+
|
5970
|
+
|
5971
|
+
if (type.indexOf(':') !== -1){
|
5972
|
+
options = factory;
|
5973
|
+
factory = name;
|
5974
|
+
fullName = type;
|
5975
|
+
} else {
|
5976
|
+
|
5977
|
+
fullName = type + ":" + name;
|
5978
|
+
}
|
5979
|
+
|
5980
|
+
this.registry.set(fullName, factory);
|
5981
|
+
this._options.set(fullName, options || {});
|
5907
5982
|
},
|
5908
5983
|
|
5909
5984
|
resolve: function(fullName) {
|
@@ -5937,19 +6012,31 @@ define("container",
|
|
5937
6012
|
optionsForType: function(type, options) {
|
5938
6013
|
if (this.parent) { illegalChildOperation('optionsForType'); }
|
5939
6014
|
|
5940
|
-
this.
|
6015
|
+
this._typeOptions.set(type, options);
|
6016
|
+
},
|
6017
|
+
|
6018
|
+
options: function(type, options) {
|
6019
|
+
this.optionsForType(type, options);
|
5941
6020
|
},
|
5942
6021
|
|
5943
6022
|
typeInjection: function(type, property, fullName) {
|
5944
6023
|
if (this.parent) { illegalChildOperation('typeInjection'); }
|
5945
6024
|
|
5946
|
-
var injections = this.typeInjections
|
6025
|
+
var injections = this.typeInjections.get(type);
|
6026
|
+
if (!injections) {
|
6027
|
+
injections = [];
|
6028
|
+
this.typeInjections.set(type, injections);
|
6029
|
+
}
|
5947
6030
|
injections.push({ property: property, fullName: fullName });
|
5948
6031
|
},
|
5949
6032
|
|
5950
6033
|
injection: function(factoryName, property, injectionName) {
|
5951
6034
|
if (this.parent) { illegalChildOperation('injection'); }
|
5952
6035
|
|
6036
|
+
if (factoryName.indexOf(':') === -1) {
|
6037
|
+
return this.typeInjection(factoryName, property, injectionName);
|
6038
|
+
}
|
6039
|
+
|
5953
6040
|
var injections = this.injections[factoryName] = this.injections[factoryName] || [];
|
5954
6041
|
injections.push({ property: property, fullName: injectionName });
|
5955
6042
|
},
|
@@ -6010,14 +6097,14 @@ define("container",
|
|
6010
6097
|
}
|
6011
6098
|
|
6012
6099
|
function option(container, fullName, optionName) {
|
6013
|
-
var options = container.
|
6100
|
+
var options = container._options.get(fullName);
|
6014
6101
|
|
6015
6102
|
if (options && options[optionName] !== undefined) {
|
6016
6103
|
return options[optionName];
|
6017
6104
|
}
|
6018
6105
|
|
6019
6106
|
var type = fullName.split(":")[0];
|
6020
|
-
options = container.
|
6107
|
+
options = container._typeOptions.get(type);
|
6021
6108
|
|
6022
6109
|
if (options) {
|
6023
6110
|
return options[optionName];
|
@@ -6041,11 +6128,12 @@ define("container",
|
|
6041
6128
|
|
6042
6129
|
if (factory) {
|
6043
6130
|
var injections = [];
|
6044
|
-
injections = injections.concat(container.typeInjections
|
6131
|
+
injections = injections.concat(container.typeInjections.get(type) || []);
|
6045
6132
|
injections = injections.concat(container.injections[fullName] || []);
|
6046
6133
|
|
6047
6134
|
var hash = buildInjections(container, injections);
|
6048
6135
|
hash.container = container;
|
6136
|
+
hash._debugContainerKey = fullName;
|
6049
6137
|
|
6050
6138
|
value = factory.create(hash);
|
6051
6139
|
|
@@ -6221,7 +6309,7 @@ Ember.empty = Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.i
|
|
6221
6309
|
Ember.compare('hello', 'hello'); // 0
|
6222
6310
|
Ember.compare('abc', 'dfg'); // -1
|
6223
6311
|
Ember.compare(2, 1); // 1
|
6224
|
-
```
|
6312
|
+
```
|
6225
6313
|
|
6226
6314
|
@method compare
|
6227
6315
|
@for Ember
|
@@ -7434,7 +7522,7 @@ Ember.Enumerable = Ember.Mixin.create(
|
|
7434
7522
|
@method find
|
7435
7523
|
@param {Function} callback The callback to execute
|
7436
7524
|
@param {Object} [target] The target object to use
|
7437
|
-
@return {Object} Found item or `
|
7525
|
+
@return {Object} Found item or `undefined`.
|
7438
7526
|
*/
|
7439
7527
|
find: function(callback, target) {
|
7440
7528
|
var len = get(this, 'length') ;
|
@@ -7462,7 +7550,7 @@ Ember.Enumerable = Ember.Mixin.create(
|
|
7462
7550
|
@method findProperty
|
7463
7551
|
@param {String} key the property to test
|
7464
7552
|
@param {String} [value] optional value to test against.
|
7465
|
-
@return {Object} found item or `
|
7553
|
+
@return {Object} found item or `undefined`
|
7466
7554
|
*/
|
7467
7555
|
findProperty: function(key, value) {
|
7468
7556
|
return this.find(iter.apply(this, arguments));
|
@@ -7522,7 +7610,7 @@ Ember.Enumerable = Ember.Mixin.create(
|
|
7522
7610
|
|
7523
7611
|
/**
|
7524
7612
|
Returns `true` if the passed function returns true for any item in the
|
7525
|
-
enumeration. This corresponds with the `
|
7613
|
+
enumeration. This corresponds with the `some()` method in JavaScript 1.6.
|
7526
7614
|
|
7527
7615
|
The callback method you provide should have the following signature (all
|
7528
7616
|
parameters are optional):
|
@@ -8042,7 +8130,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
|
|
8042
8130
|
arr.indexOf("a", -1); // 4
|
8043
8131
|
arr.indexOf("b", 3); // -1
|
8044
8132
|
arr.indexOf("a", 100); // -1
|
8045
|
-
```
|
8133
|
+
```
|
8046
8134
|
|
8047
8135
|
@method indexOf
|
8048
8136
|
@param {Object} object the item to search for
|
@@ -8687,7 +8775,7 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
|
|
8687
8775
|
var colors = ["red", "green", "blue"];
|
8688
8776
|
colors.insertAt(2, "yellow"); // ["red", "green", "yellow", "blue"]
|
8689
8777
|
colors.insertAt(5, "orange"); // Error: Index out of range
|
8690
|
-
```
|
8778
|
+
```
|
8691
8779
|
|
8692
8780
|
@method insertAt
|
8693
8781
|
@param {Number} idx index of insert the object at.
|
@@ -8988,9 +9076,6 @@ var get = Ember.get, set = Ember.set, defineProperty = Ember.defineProperty;
|
|
8988
9076
|
*/
|
8989
9077
|
Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
|
8990
9078
|
|
8991
|
-
// compatibility
|
8992
|
-
isObserverable: true,
|
8993
|
-
|
8994
9079
|
/**
|
8995
9080
|
Retrieves the value of a property from the object.
|
8996
9081
|
|
@@ -9577,7 +9662,7 @@ Ember.Evented = Ember.Mixin.create({
|
|
9577
9662
|
event.
|
9578
9663
|
|
9579
9664
|
```javascript
|
9580
|
-
person.on('didEat', food) {
|
9665
|
+
person.on('didEat', function(food) {
|
9581
9666
|
console.log('person ate some ' + food);
|
9582
9667
|
});
|
9583
9668
|
|
@@ -9856,9 +9941,9 @@ function makeCtor() {
|
|
9856
9941
|
}
|
9857
9942
|
|
9858
9943
|
var CoreObject = makeCtor();
|
9944
|
+
CoreObject.toString = function() { return "Ember.CoreObject"; };
|
9859
9945
|
|
9860
9946
|
CoreObject.PrototypeMixin = Mixin.create({
|
9861
|
-
|
9862
9947
|
reopen: function() {
|
9863
9948
|
applyMixin(this, arguments, true);
|
9864
9949
|
return this;
|
@@ -9959,9 +10044,10 @@ CoreObject.PrototypeMixin = Mixin.create({
|
|
9959
10044
|
@return {Ember.Object} receiver
|
9960
10045
|
*/
|
9961
10046
|
destroy: function() {
|
9962
|
-
if (this.
|
10047
|
+
if (this._didCallDestroy) { return; }
|
9963
10048
|
|
9964
10049
|
this.isDestroying = true;
|
10050
|
+
this._didCallDestroy = true;
|
9965
10051
|
|
9966
10052
|
if (this.willDestroy) { this.willDestroy(); }
|
9967
10053
|
|
@@ -10029,6 +10115,8 @@ CoreObject.PrototypeMixin = Mixin.create({
|
|
10029
10115
|
}
|
10030
10116
|
});
|
10031
10117
|
|
10118
|
+
CoreObject.PrototypeMixin.ownerConstructor = CoreObject;
|
10119
|
+
|
10032
10120
|
function makeToString(ret) {
|
10033
10121
|
return function() { return ret; };
|
10034
10122
|
}
|
@@ -10166,6 +10254,8 @@ var ClassMixin = Mixin.create({
|
|
10166
10254
|
|
10167
10255
|
});
|
10168
10256
|
|
10257
|
+
ClassMixin.ownerConstructor = CoreObject;
|
10258
|
+
|
10169
10259
|
if (Ember.config.overrideClassMixin) {
|
10170
10260
|
Ember.config.overrideClassMixin(ClassMixin);
|
10171
10261
|
}
|
@@ -10657,6 +10747,7 @@ Ember.Set = Ember.CoreObject.extend(Ember.MutableEnumerable, Ember.Copyable, Emb
|
|
10657
10747
|
@uses Ember.Observable
|
10658
10748
|
*/
|
10659
10749
|
Ember.Object = Ember.CoreObject.extend(Ember.Observable);
|
10750
|
+
Ember.Object.toString = function() { return "Ember.Object"; };
|
10660
10751
|
|
10661
10752
|
})();
|
10662
10753
|
|
@@ -10717,16 +10808,28 @@ var Namespace = Ember.Namespace = Ember.Object.extend({
|
|
10717
10808
|
|
10718
10809
|
Namespace.reopenClass({
|
10719
10810
|
NAMESPACES: [Ember],
|
10811
|
+
NAMESPACES_BY_ID: {},
|
10720
10812
|
PROCESSED: false,
|
10721
|
-
processAll: processAllNamespaces
|
10813
|
+
processAll: processAllNamespaces,
|
10814
|
+
byName: function(name) {
|
10815
|
+
if (!Ember.BOOTED) {
|
10816
|
+
processAllNamespaces();
|
10817
|
+
}
|
10818
|
+
|
10819
|
+
return NAMESPACES_BY_ID[name];
|
10820
|
+
}
|
10722
10821
|
});
|
10723
10822
|
|
10823
|
+
var NAMESPACES_BY_ID = Namespace.NAMESPACES_BY_ID;
|
10824
|
+
|
10724
10825
|
var hasOwnProp = ({}).hasOwnProperty,
|
10725
10826
|
guidFor = Ember.guidFor;
|
10726
10827
|
|
10727
10828
|
function processNamespace(paths, root, seen) {
|
10728
10829
|
var idx = paths.length;
|
10729
10830
|
|
10831
|
+
NAMESPACES_BY_ID[paths.join('.')] = root;
|
10832
|
+
|
10730
10833
|
// Loop over all of the keys in the namespace, looking for classes
|
10731
10834
|
for(var key in root) {
|
10732
10835
|
if (!hasOwnProp.call(root, key)) { continue; }
|
@@ -10826,12 +10929,15 @@ function classToString() {
|
|
10826
10929
|
}
|
10827
10930
|
|
10828
10931
|
function processAllNamespaces() {
|
10829
|
-
|
10932
|
+
var unprocessedNamespaces = !Namespace.PROCESSED,
|
10933
|
+
unprocessedMixins = Ember.anyUnprocessedMixins;
|
10934
|
+
|
10935
|
+
if (unprocessedNamespaces) {
|
10830
10936
|
findNamespaces();
|
10831
10937
|
Namespace.PROCESSED = true;
|
10832
10938
|
}
|
10833
10939
|
|
10834
|
-
if (
|
10940
|
+
if (unprocessedNamespaces || unprocessedMixins) {
|
10835
10941
|
var namespaces = Namespace.NAMESPACES, namespace;
|
10836
10942
|
for (var i=0, l=namespaces.length; i<l; i++) {
|
10837
10943
|
namespace = namespaces[i];
|
@@ -10957,9 +11063,7 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
|
|
10957
11063
|
|
10958
11064
|
@property arrangedContent
|
10959
11065
|
*/
|
10960
|
-
arrangedContent: Ember.computed('content',
|
10961
|
-
return get(this, 'content');
|
10962
|
-
}),
|
11066
|
+
arrangedContent: Ember.computed.alias('content'),
|
10963
11067
|
|
10964
11068
|
/**
|
10965
11069
|
Should actually retrieve the object at the specified index from the
|
@@ -11242,6 +11346,10 @@ Ember.ObjectProxy = Ember.Object.extend(
|
|
11242
11346
|
|
11243
11347
|
}, 'content'),
|
11244
11348
|
|
11349
|
+
isTruthy: Ember.computed.bool('content'),
|
11350
|
+
|
11351
|
+
_debugContainerKey: null,
|
11352
|
+
|
11245
11353
|
willWatchProperty: function (key) {
|
11246
11354
|
var contentKey = 'content.' + key;
|
11247
11355
|
addBeforeObserver(this, contentKey, null, contentPropertyWillChange);
|
@@ -11666,7 +11774,7 @@ Ember.Deferred = Deferred;
|
|
11666
11774
|
@submodule ember-runtime
|
11667
11775
|
*/
|
11668
11776
|
|
11669
|
-
var loadHooks = {};
|
11777
|
+
var loadHooks = Ember.ENV.EMBER_LOAD_HOOKS || {};
|
11670
11778
|
var loaded = {};
|
11671
11779
|
|
11672
11780
|
/**
|
@@ -11753,6 +11861,9 @@ var get = Ember.get;
|
|
11753
11861
|
@extends Ember.Mixin
|
11754
11862
|
*/
|
11755
11863
|
Ember.ControllerMixin = Ember.Mixin.create({
|
11864
|
+
/* ducktype as a controller */
|
11865
|
+
isController: true,
|
11866
|
+
|
11756
11867
|
/**
|
11757
11868
|
The object to which events from the view should be sent.
|
11758
11869
|
|
@@ -11771,6 +11882,8 @@ Ember.ControllerMixin = Ember.Mixin.create({
|
|
11771
11882
|
|
11772
11883
|
store: null,
|
11773
11884
|
|
11885
|
+
model: Ember.computed.alias('content'),
|
11886
|
+
|
11774
11887
|
send: function(actionName) {
|
11775
11888
|
var args = [].slice.call(arguments, 1), target;
|
11776
11889
|
|
@@ -11819,7 +11932,8 @@ var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach;
|
|
11819
11932
|
|
11820
11933
|
songsController = Ember.ArrayController.create({
|
11821
11934
|
content: songs,
|
11822
|
-
sortProperties: ['trackNumber']
|
11935
|
+
sortProperties: ['trackNumber'],
|
11936
|
+
sortAscending: true
|
11823
11937
|
});
|
11824
11938
|
|
11825
11939
|
songsController.get('firstObject'); // {trackNumber: 2, title: 'Back in the U.S.S.R.'}
|
@@ -11834,7 +11948,19 @@ var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach;
|
|
11834
11948
|
@uses Ember.MutableEnumerable
|
11835
11949
|
*/
|
11836
11950
|
Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable, {
|
11951
|
+
|
11952
|
+
/**
|
11953
|
+
Specifies which properties dictate the arrangedContent's sort order.
|
11954
|
+
|
11955
|
+
@property {Array} sortProperties
|
11956
|
+
*/
|
11837
11957
|
sortProperties: null,
|
11958
|
+
|
11959
|
+
/**
|
11960
|
+
Specifies the arrangedContent's sort direction
|
11961
|
+
|
11962
|
+
@property {Boolean} sortAscending
|
11963
|
+
*/
|
11838
11964
|
sortAscending: true,
|
11839
11965
|
|
11840
11966
|
orderBy: function(item1, item2) {
|
@@ -11870,9 +11996,7 @@ Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable, {
|
|
11870
11996
|
return this._super();
|
11871
11997
|
},
|
11872
11998
|
|
11873
|
-
isSorted: Ember.computed('sortProperties',
|
11874
|
-
return !!get(this, 'sortProperties');
|
11875
|
-
}),
|
11999
|
+
isSorted: Ember.computed.bool('sortProperties'),
|
11876
12000
|
|
11877
12001
|
arrangedContent: Ember.computed('content', 'sortProperties.@each', function(key, value) {
|
11878
12002
|
var content = get(this, 'content'),
|
@@ -12147,20 +12271,22 @@ Ember.ArrayController = Ember.ArrayProxy.extend(Ember.ControllerMixin,
|
|
12147
12271
|
|
12148
12272
|
objectAtContent: function(idx) {
|
12149
12273
|
var length = get(this, 'length'),
|
12150
|
-
object = get(this,'arrangedContent').objectAt(idx)
|
12151
|
-
controllerClass = this.lookupItemController(object);
|
12274
|
+
object = get(this,'arrangedContent').objectAt(idx);
|
12152
12275
|
|
12153
|
-
if (
|
12154
|
-
|
12155
|
-
|
12156
|
-
|
12157
|
-
|
12158
|
-
// controllerClass is defined but the index is out of range, we want to
|
12159
|
-
// return the "out of range" value, whatever that might be. Rather than
|
12160
|
-
// make assumptions (e.g. guessing `null` or `undefined`) we defer this to
|
12161
|
-
// `arrangedContent`.
|
12162
|
-
return object;
|
12276
|
+
if (idx >= 0 && idx < length) {
|
12277
|
+
var controllerClass = this.lookupItemController(object);
|
12278
|
+
if (controllerClass) {
|
12279
|
+
return this.controllerAt(idx, object, controllerClass);
|
12280
|
+
}
|
12163
12281
|
}
|
12282
|
+
|
12283
|
+
// When `controllerClass` is falsy, we have not opted in to using item
|
12284
|
+
// controllers, so return the object directly.
|
12285
|
+
|
12286
|
+
// When the index is out of range, we want to return the "out of range"
|
12287
|
+
// value, whatever that might be. Rather than make assumptions
|
12288
|
+
// (e.g. guessing `null` or `undefined`) we defer this to `arrangedContent`.
|
12289
|
+
return object;
|
12164
12290
|
},
|
12165
12291
|
|
12166
12292
|
arrangedContentDidChange: function() {
|
@@ -12186,6 +12312,7 @@ Ember.ArrayController = Ember.ArrayProxy.extend(Ember.ControllerMixin,
|
|
12186
12312
|
|
12187
12313
|
init: function() {
|
12188
12314
|
this._super();
|
12315
|
+
if (!this.get('content')) { this.set('content', Ember.A()); }
|
12189
12316
|
this._resetSubContainers();
|
12190
12317
|
},
|
12191
12318
|
|
@@ -12558,6 +12685,21 @@ Ember._RenderBuffer.prototype =
|
|
12558
12685
|
*/
|
12559
12686
|
elementAttributes: null,
|
12560
12687
|
|
12688
|
+
/**
|
12689
|
+
A hash keyed on the name of the properties and whose value will be
|
12690
|
+
applied to that property. For example, if you wanted to apply a
|
12691
|
+
`checked=true` property to an element, you would set the
|
12692
|
+
elementProperties hash to `{'checked':true}`.
|
12693
|
+
|
12694
|
+
You should not maintain this hash yourself, rather, you should use
|
12695
|
+
the `prop()` method of `Ember.RenderBuffer`.
|
12696
|
+
|
12697
|
+
@property elementProperties
|
12698
|
+
@type Hash
|
12699
|
+
@default {}
|
12700
|
+
*/
|
12701
|
+
elementProperties: null,
|
12702
|
+
|
12561
12703
|
/**
|
12562
12704
|
The tagname of the element an instance of `Ember.RenderBuffer` represents.
|
12563
12705
|
|
@@ -12680,6 +12822,41 @@ Ember._RenderBuffer.prototype =
|
|
12680
12822
|
return this;
|
12681
12823
|
},
|
12682
12824
|
|
12825
|
+
/**
|
12826
|
+
Adds an property which will be rendered to the element.
|
12827
|
+
|
12828
|
+
@method prop
|
12829
|
+
@param {String} name The name of the property
|
12830
|
+
@param {String} value The value to add to the property
|
12831
|
+
@chainable
|
12832
|
+
@return {Ember.RenderBuffer|String} this or the current property value
|
12833
|
+
*/
|
12834
|
+
prop: function(name, value) {
|
12835
|
+
var properties = this.elementProperties = (this.elementProperties || {});
|
12836
|
+
|
12837
|
+
if (arguments.length === 1) {
|
12838
|
+
return properties[name];
|
12839
|
+
} else {
|
12840
|
+
properties[name] = value;
|
12841
|
+
}
|
12842
|
+
|
12843
|
+
return this;
|
12844
|
+
},
|
12845
|
+
|
12846
|
+
/**
|
12847
|
+
Remove an property from the list of properties to render.
|
12848
|
+
|
12849
|
+
@method removeProp
|
12850
|
+
@param {String} name The name of the property
|
12851
|
+
@chainable
|
12852
|
+
*/
|
12853
|
+
removeProp: function(name) {
|
12854
|
+
var properties = this.elementProperties;
|
12855
|
+
if (properties) { delete properties[name]; }
|
12856
|
+
|
12857
|
+
return this;
|
12858
|
+
},
|
12859
|
+
|
12683
12860
|
/**
|
12684
12861
|
Adds a style to the style attribute which will be rendered to the element.
|
12685
12862
|
|
@@ -12713,8 +12890,9 @@ Ember._RenderBuffer.prototype =
|
|
12713
12890
|
id = this.elementId,
|
12714
12891
|
classes = this.classes,
|
12715
12892
|
attrs = this.elementAttributes,
|
12893
|
+
props = this.elementProperties,
|
12716
12894
|
style = this.elementStyle,
|
12717
|
-
prop;
|
12895
|
+
attr, prop;
|
12718
12896
|
|
12719
12897
|
buffer.push('<' + tagName);
|
12720
12898
|
|
@@ -12742,15 +12920,32 @@ Ember._RenderBuffer.prototype =
|
|
12742
12920
|
}
|
12743
12921
|
|
12744
12922
|
if (attrs) {
|
12745
|
-
for (
|
12746
|
-
if (attrs.hasOwnProperty(
|
12747
|
-
buffer.push(' ' +
|
12923
|
+
for (attr in attrs) {
|
12924
|
+
if (attrs.hasOwnProperty(attr)) {
|
12925
|
+
buffer.push(' ' + attr + '="' + this._escapeAttribute(attrs[attr]) + '"');
|
12748
12926
|
}
|
12749
12927
|
}
|
12750
12928
|
|
12751
12929
|
this.elementAttributes = null;
|
12752
12930
|
}
|
12753
12931
|
|
12932
|
+
if (props) {
|
12933
|
+
for (prop in props) {
|
12934
|
+
if (props.hasOwnProperty(prop)) {
|
12935
|
+
var value = props[prop];
|
12936
|
+
if (value || typeof(value) === 'number') {
|
12937
|
+
if (value === true) {
|
12938
|
+
buffer.push(' ' + prop + '="' + prop + '"');
|
12939
|
+
} else {
|
12940
|
+
buffer.push(' ' + prop + '="' + this._escapeAttribute(props[prop]) + '"');
|
12941
|
+
}
|
12942
|
+
}
|
12943
|
+
}
|
12944
|
+
}
|
12945
|
+
|
12946
|
+
this.elementProperties = null;
|
12947
|
+
}
|
12948
|
+
|
12754
12949
|
buffer.push('>');
|
12755
12950
|
},
|
12756
12951
|
|
@@ -12770,8 +12965,9 @@ Ember._RenderBuffer.prototype =
|
|
12770
12965
|
id = this.elementId,
|
12771
12966
|
classes = this.classes,
|
12772
12967
|
attrs = this.elementAttributes,
|
12968
|
+
props = this.elementProperties,
|
12773
12969
|
style = this.elementStyle,
|
12774
|
-
styleBuffer = '', prop;
|
12970
|
+
styleBuffer = '', attr, prop;
|
12775
12971
|
|
12776
12972
|
if (id) {
|
12777
12973
|
$element.attr('id', id);
|
@@ -12795,15 +12991,25 @@ Ember._RenderBuffer.prototype =
|
|
12795
12991
|
}
|
12796
12992
|
|
12797
12993
|
if (attrs) {
|
12798
|
-
for (
|
12799
|
-
if (attrs.hasOwnProperty(
|
12800
|
-
$element.attr(
|
12994
|
+
for (attr in attrs) {
|
12995
|
+
if (attrs.hasOwnProperty(attr)) {
|
12996
|
+
$element.attr(attr, attrs[attr]);
|
12801
12997
|
}
|
12802
12998
|
}
|
12803
12999
|
|
12804
13000
|
this.elementAttributes = null;
|
12805
13001
|
}
|
12806
13002
|
|
13003
|
+
if (props) {
|
13004
|
+
for (prop in props) {
|
13005
|
+
if (props.hasOwnProperty(prop)) {
|
13006
|
+
$element.prop(prop, props[prop]);
|
13007
|
+
}
|
13008
|
+
}
|
13009
|
+
|
13010
|
+
this.elementProperties = null;
|
13011
|
+
}
|
13012
|
+
|
12807
13013
|
return element;
|
12808
13014
|
},
|
12809
13015
|
|
@@ -13017,11 +13223,13 @@ Ember.EventDispatcher = Ember.Object.extend(
|
|
13017
13223
|
rootElement.delegate('[data-ember-action]', event + '.ember', function(evt) {
|
13018
13224
|
return Ember.handleErrors(function() {
|
13019
13225
|
var actionId = Ember.$(evt.currentTarget).attr('data-ember-action'),
|
13020
|
-
action = Ember.Handlebars.ActionHelper.registeredActions[actionId]
|
13021
|
-
handler = action.handler;
|
13226
|
+
action = Ember.Handlebars.ActionHelper.registeredActions[actionId];
|
13022
13227
|
|
13023
|
-
|
13024
|
-
|
13228
|
+
// We have to check for action here since in some cases, jQuery will trigger
|
13229
|
+
// an event on `removeChild` (i.e. focusout) after we've already torn down the
|
13230
|
+
// action handlers for the view.
|
13231
|
+
if (action && action.eventName === eventName) {
|
13232
|
+
return action.handler(evt);
|
13025
13233
|
}
|
13026
13234
|
}, this);
|
13027
13235
|
});
|
@@ -13110,7 +13318,25 @@ Ember.ControllerMixin.reopen({
|
|
13110
13318
|
target: null,
|
13111
13319
|
namespace: null,
|
13112
13320
|
view: null,
|
13113
|
-
container: null
|
13321
|
+
container: null,
|
13322
|
+
_childContainers: null,
|
13323
|
+
|
13324
|
+
init: function() {
|
13325
|
+
this._super();
|
13326
|
+
set(this, '_childContainers', {});
|
13327
|
+
},
|
13328
|
+
|
13329
|
+
_modelDidChange: Ember.observer(function() {
|
13330
|
+
var containers = get(this, '_childContainers'),
|
13331
|
+
container;
|
13332
|
+
|
13333
|
+
for (var prop in containers) {
|
13334
|
+
if (!containers.hasOwnProperty(prop)) { continue; }
|
13335
|
+
containers[prop].destroy();
|
13336
|
+
}
|
13337
|
+
|
13338
|
+
set(this, '_childContainers', {});
|
13339
|
+
}, 'model')
|
13114
13340
|
});
|
13115
13341
|
|
13116
13342
|
})();
|
@@ -13138,9 +13364,7 @@ var a_forEach = Ember.EnumerableUtils.forEach;
|
|
13138
13364
|
var a_addObject = Ember.EnumerableUtils.addObject;
|
13139
13365
|
|
13140
13366
|
var childViewsProperty = Ember.computed(function() {
|
13141
|
-
var childViews = this._childViews;
|
13142
|
-
|
13143
|
-
var ret = Ember.A();
|
13367
|
+
var childViews = this._childViews, ret = Ember.A(), view = this;
|
13144
13368
|
|
13145
13369
|
a_forEach(childViews, function(view) {
|
13146
13370
|
if (view.isVirtual) {
|
@@ -13150,6 +13374,14 @@ var childViewsProperty = Ember.computed(function() {
|
|
13150
13374
|
}
|
13151
13375
|
});
|
13152
13376
|
|
13377
|
+
ret.replace = function (idx, removedCount, addedViews) {
|
13378
|
+
if (view instanceof Ember.ContainerView) {
|
13379
|
+
|
13380
|
+
return view.replace(idx, removedCount, addedViews);
|
13381
|
+
}
|
13382
|
+
throw new Error("childViews is immutable");
|
13383
|
+
};
|
13384
|
+
|
13153
13385
|
return ret;
|
13154
13386
|
});
|
13155
13387
|
|
@@ -13175,7 +13407,10 @@ Ember.CoreView = Ember.Object.extend(Ember.Evented, {
|
|
13175
13407
|
|
13176
13408
|
// Register the view for event handling. This hash is used by
|
13177
13409
|
// Ember.EventDispatcher to dispatch incoming events.
|
13178
|
-
if (!this.isVirtual)
|
13410
|
+
if (!this.isVirtual) {
|
13411
|
+
|
13412
|
+
Ember.View.views[this.elementId] = this;
|
13413
|
+
}
|
13179
13414
|
|
13180
13415
|
this.addBeforeObserver('elementId', function() {
|
13181
13416
|
throw new Error("Changing a view's elementId after creation is not allowed");
|
@@ -13942,6 +14177,7 @@ Ember.View = Ember.CoreView.extend(
|
|
13942
14177
|
var templateName = get(this, 'templateName'),
|
13943
14178
|
template = this.templateForName(templateName, 'template');
|
13944
14179
|
|
14180
|
+
|
13945
14181
|
return template || get(this, 'defaultTemplate');
|
13946
14182
|
}).property('templateName'),
|
13947
14183
|
|
@@ -13983,6 +14219,7 @@ Ember.View = Ember.CoreView.extend(
|
|
13983
14219
|
var layoutName = get(this, 'layoutName'),
|
13984
14220
|
layout = this.templateForName(layoutName, 'layout');
|
13985
14221
|
|
14222
|
+
|
13986
14223
|
return layout || get(this, 'defaultLayout');
|
13987
14224
|
}).property('layoutName'),
|
13988
14225
|
|
@@ -14359,11 +14596,16 @@ Ember.View = Ember.CoreView.extend(
|
|
14359
14596
|
oldClass = dasherizedClass;
|
14360
14597
|
}
|
14361
14598
|
|
14362
|
-
|
14363
|
-
|
14599
|
+
this.registerObserver(this, parsedPath.path, observer);
|
14600
|
+
// Remove className so when the view is rerendered,
|
14601
|
+
// the className is added based on binding reevaluation
|
14364
14602
|
this.one('willClearRender', function() {
|
14365
|
-
|
14603
|
+
if (oldClass) {
|
14604
|
+
classNames.removeObject(oldClass);
|
14605
|
+
oldClass = null;
|
14606
|
+
}
|
14366
14607
|
});
|
14608
|
+
|
14367
14609
|
}, this);
|
14368
14610
|
},
|
14369
14611
|
|
@@ -14395,11 +14637,7 @@ Ember.View = Ember.CoreView.extend(
|
|
14395
14637
|
Ember.View.applyAttributeBindings(elem, attributeName, attributeValue);
|
14396
14638
|
};
|
14397
14639
|
|
14398
|
-
|
14399
|
-
|
14400
|
-
this.one('willClearRender', function() {
|
14401
|
-
removeObserver(this, property, observer);
|
14402
|
-
});
|
14640
|
+
this.registerObserver(this, property, observer);
|
14403
14641
|
|
14404
14642
|
// Determine the current value and add it to the render buffer
|
14405
14643
|
// if necessary.
|
@@ -14610,7 +14848,7 @@ Ember.View = Ember.CoreView.extend(
|
|
14610
14848
|
// element.
|
14611
14849
|
// In the interim, we will just re-render if that happens. It is more
|
14612
14850
|
// important than elements get garbage collected.
|
14613
|
-
this.destroyElement();
|
14851
|
+
if (!this.removedFromDOM) { this.destroyElement(); }
|
14614
14852
|
this.invokeRecursively(function(view) {
|
14615
14853
|
if (view.clearRenderedChildren) { view.clearRenderedChildren(); }
|
14616
14854
|
});
|
@@ -15083,12 +15321,17 @@ Ember.View = Ember.CoreView.extend(
|
|
15083
15321
|
// so collect any information we need before calling super.
|
15084
15322
|
var childViews = this._childViews,
|
15085
15323
|
parent = this._parentView,
|
15086
|
-
childLen;
|
15324
|
+
childLen, i;
|
15087
15325
|
|
15088
15326
|
// destroy the element -- this will avoid each child view destroying
|
15089
15327
|
// the element over and over again...
|
15090
15328
|
if (!this.removedFromDOM) { this.destroyElement(); }
|
15091
15329
|
|
15330
|
+
childLen = childViews.length;
|
15331
|
+
for (i=childLen-1; i>=0; i--) {
|
15332
|
+
childViews[i].removedFromDOM = true;
|
15333
|
+
}
|
15334
|
+
|
15092
15335
|
// remove from non-virtual parent view if viewName was specified
|
15093
15336
|
if (this.viewName) {
|
15094
15337
|
var nonVirtualParentView = get(this, 'parentView');
|
@@ -15105,8 +15348,7 @@ Ember.View = Ember.CoreView.extend(
|
|
15105
15348
|
this.transitionTo('destroyed');
|
15106
15349
|
|
15107
15350
|
childLen = childViews.length;
|
15108
|
-
for (
|
15109
|
-
childViews[i].removedFromDOM = true;
|
15351
|
+
for (i=childLen-1; i>=0; i--) {
|
15110
15352
|
childViews[i].destroy();
|
15111
15353
|
}
|
15112
15354
|
|
@@ -15251,6 +15493,14 @@ Ember.View = Ember.CoreView.extend(
|
|
15251
15493
|
*/
|
15252
15494
|
handleEvent: function(eventName, evt) {
|
15253
15495
|
return this.currentState.handleEvent(this, eventName, evt);
|
15496
|
+
},
|
15497
|
+
|
15498
|
+
registerObserver: function(root, path, target, observer) {
|
15499
|
+
Ember.addObserver(root, path, target, observer);
|
15500
|
+
|
15501
|
+
this.one('willClearRender', function() {
|
15502
|
+
Ember.removeObserver(root, path, target, observer);
|
15503
|
+
});
|
15254
15504
|
}
|
15255
15505
|
|
15256
15506
|
});
|
@@ -15441,13 +15691,17 @@ Ember.View.childViewsProperty = childViewsProperty;
|
|
15441
15691
|
|
15442
15692
|
Ember.View.applyAttributeBindings = function(elem, name, value) {
|
15443
15693
|
var type = Ember.typeOf(value);
|
15444
|
-
var currentValue = elem.attr(name);
|
15445
15694
|
|
15446
15695
|
// if this changes, also change the logic in ember-handlebars/lib/helpers/binding.js
|
15447
|
-
if ((type === 'string' || (type === 'number' && !isNaN(value)))
|
15448
|
-
elem.attr(name
|
15449
|
-
|
15450
|
-
|
15696
|
+
if (name !== 'value' && (type === 'string' || (type === 'number' && !isNaN(value)))) {
|
15697
|
+
if (value !== elem.attr(name)) {
|
15698
|
+
elem.attr(name, value);
|
15699
|
+
}
|
15700
|
+
} else if (name === 'value' || type === 'boolean') {
|
15701
|
+
if (value !== elem.prop(name)) {
|
15702
|
+
// value and booleans should always be properties
|
15703
|
+
elem.prop(name, value);
|
15704
|
+
}
|
15451
15705
|
} else if (!value) {
|
15452
15706
|
elem.removeAttr(name);
|
15453
15707
|
}
|
@@ -15800,14 +16054,9 @@ var states = Ember.View.cloneStates(Ember.View.states);
|
|
15800
16054
|
var get = Ember.get, set = Ember.set, meta = Ember.meta;
|
15801
16055
|
var forEach = Ember.EnumerableUtils.forEach;
|
15802
16056
|
|
15803
|
-
var childViewsProperty = Ember.computed(function() {
|
15804
|
-
return get(this, '_childViews');
|
15805
|
-
}).property('_childViews');
|
15806
|
-
|
15807
16057
|
/**
|
15808
|
-
A `ContainerView` is an `Ember.View` subclass that
|
15809
|
-
programatic management of
|
15810
|
-
update the `ContainerView` instance's rendered DOM representation.
|
16058
|
+
A `ContainerView` is an `Ember.View` subclass that implements `Ember.MutableArray`
|
16059
|
+
allowing programatic management of its child views.
|
15811
16060
|
|
15812
16061
|
## Setting Initial Child Views
|
15813
16062
|
|
@@ -15847,11 +16096,9 @@ var childViewsProperty = Ember.computed(function() {
|
|
15847
16096
|
|
15848
16097
|
## Adding and Removing Child Views
|
15849
16098
|
|
15850
|
-
The
|
15851
|
-
manipulating the `childViews` property directly.
|
16099
|
+
The container view implements `Ember.MutableArray` allowing programatic management of its child views.
|
15852
16100
|
|
15853
|
-
To remove a view pass that view into a `removeObject` call on the container
|
15854
|
-
`childViews` property.
|
16101
|
+
To remove a view, pass that view into a `removeObject` call on the container view.
|
15855
16102
|
|
15856
16103
|
Given an empty `<body>` the following code
|
15857
16104
|
|
@@ -15882,9 +16129,9 @@ var childViewsProperty = Ember.computed(function() {
|
|
15882
16129
|
Removing a view
|
15883
16130
|
|
15884
16131
|
```javascript
|
15885
|
-
aContainer.
|
15886
|
-
aContainer.
|
15887
|
-
aContainer.
|
16132
|
+
aContainer.toArray(); // [aContainer.aView, aContainer.bView]
|
16133
|
+
aContainer.removeObject(aContainer.get('bView'));
|
16134
|
+
aContainer.toArray(); // [aContainer.aView]
|
15888
16135
|
```
|
15889
16136
|
|
15890
16137
|
Will result in the following HTML
|
@@ -15896,7 +16143,7 @@ var childViewsProperty = Ember.computed(function() {
|
|
15896
16143
|
```
|
15897
16144
|
|
15898
16145
|
Similarly, adding a child view is accomplished by adding `Ember.View` instances to the
|
15899
|
-
container
|
16146
|
+
container view.
|
15900
16147
|
|
15901
16148
|
Given an empty `<body>` the following code
|
15902
16149
|
|
@@ -15931,9 +16178,9 @@ var childViewsProperty = Ember.computed(function() {
|
|
15931
16178
|
template: Ember.Handlebars.compile("Another view")
|
15932
16179
|
});
|
15933
16180
|
|
15934
|
-
aContainer.
|
15935
|
-
aContainer.
|
15936
|
-
aContainer.
|
16181
|
+
aContainer.toArray(); // [aContainer.aView, aContainer.bView]
|
16182
|
+
aContainer.pushObject(AnotherViewClass.create());
|
16183
|
+
aContainer.toArray(); // [aContainer.aView, aContainer.bView, <AnotherViewClass instance>]
|
15937
16184
|
```
|
15938
16185
|
|
15939
16186
|
Will result in the following HTML
|
@@ -15946,71 +16193,20 @@ var childViewsProperty = Ember.computed(function() {
|
|
15946
16193
|
</div>
|
15947
16194
|
```
|
15948
16195
|
|
15949
|
-
|
15950
|
-
to `remove` or `removeFromParent` or calls to a container's `removeChild` may
|
15951
|
-
not behave correctly.
|
16196
|
+
## Templates and Layout
|
15952
16197
|
|
15953
|
-
|
15954
|
-
|
16198
|
+
A `template`, `templateName`, `defaultTemplate`, `layout`, `layoutName` or
|
16199
|
+
`defaultLayout` property on a container view will not result in the template
|
16200
|
+
or layout being rendered. The HTML contents of a `Ember.ContainerView`'s DOM
|
16201
|
+
representation will only be the rendered HTML of its child views.
|
15955
16202
|
|
15956
|
-
|
15957
|
-
from the container's `childView`s but keep its HTML within the container's
|
15958
|
-
rendered view.
|
16203
|
+
## Binding a View to Display
|
15959
16204
|
|
15960
|
-
|
15961
|
-
|
15962
|
-
|
15963
|
-
|
15964
|
-
|
15965
|
-
classNames: ['the-container'],
|
15966
|
-
childViews: ['aView', 'bView'],
|
15967
|
-
aView: Ember.View.create({
|
15968
|
-
template: Ember.Handlebars.compile("A")
|
15969
|
-
}),
|
15970
|
-
bView: Ember.View.create({
|
15971
|
-
template: Ember.Handlebars.compile("B")
|
15972
|
-
})
|
15973
|
-
});
|
15974
|
-
|
15975
|
-
aContainer.appendTo('body');
|
15976
|
-
```
|
15977
|
-
|
15978
|
-
Results in the HTML
|
15979
|
-
|
15980
|
-
```html
|
15981
|
-
<div class="ember-view the-container">
|
15982
|
-
<div class="ember-view">A</div>
|
15983
|
-
<div class="ember-view">B</div>
|
15984
|
-
</div>
|
15985
|
-
```
|
15986
|
-
|
15987
|
-
Calling `aContainer.get('aView').removeFromParent()` will result in the
|
15988
|
-
following HTML
|
15989
|
-
|
15990
|
-
```html
|
15991
|
-
<div class="ember-view the-container">
|
15992
|
-
<div class="ember-view">B</div>
|
15993
|
-
</div>
|
15994
|
-
```
|
15995
|
-
|
15996
|
-
And the `Ember.View` instance stored in `aContainer.aView` will be removed from `aContainer`'s
|
15997
|
-
`childViews` array.
|
15998
|
-
|
15999
|
-
## Templates and Layout
|
16000
|
-
|
16001
|
-
A `template`, `templateName`, `defaultTemplate`, `layout`, `layoutName` or
|
16002
|
-
`defaultLayout` property on a container view will not result in the template
|
16003
|
-
or layout being rendered. The HTML contents of a `Ember.ContainerView`'s DOM
|
16004
|
-
representation will only be the rendered HTML of its child views.
|
16005
|
-
|
16006
|
-
## Binding a View to Display
|
16007
|
-
|
16008
|
-
If you would like to display a single view in your ContainerView, you can set
|
16009
|
-
its `currentView` property. When the `currentView` property is set to a view
|
16010
|
-
instance, it will be added to the ContainerView's `childViews` array. If the
|
16011
|
-
`currentView` property is later changed to a different view, the new view
|
16012
|
-
will replace the old view. If `currentView` is set to `null`, the last
|
16013
|
-
`currentView` will be removed.
|
16205
|
+
If you would like to display a single view in your ContainerView, you can set
|
16206
|
+
its `currentView` property. When the `currentView` property is set to a view
|
16207
|
+
instance, it will be added to the ContainerView. If the `currentView` property
|
16208
|
+
is later changed to a different view, the new view will replace the old view.
|
16209
|
+
If `currentView` is set to `null`, the last `currentView` will be removed.
|
16014
16210
|
|
16015
16211
|
This functionality is useful for cases where you want to bind the display of
|
16016
16212
|
a ContainerView to a controller or state manager. For example, you can bind
|
@@ -16032,15 +16228,16 @@ var childViewsProperty = Ember.computed(function() {
|
|
16032
16228
|
@namespace Ember
|
16033
16229
|
@extends Ember.View
|
16034
16230
|
*/
|
16035
|
-
|
16036
|
-
Ember.ContainerView = Ember.View.extend({
|
16231
|
+
Ember.ContainerView = Ember.View.extend(Ember.MutableArray, {
|
16037
16232
|
states: states,
|
16038
16233
|
|
16039
16234
|
init: function() {
|
16040
16235
|
this._super();
|
16041
16236
|
|
16042
16237
|
var childViews = get(this, 'childViews');
|
16043
|
-
|
16238
|
+
|
16239
|
+
// redefine view's childViews property that was obliterated
|
16240
|
+
Ember.defineProperty(this, 'childViews', Ember.View.childViewsProperty);
|
16044
16241
|
|
16045
16242
|
var _childViews = this._childViews;
|
16046
16243
|
|
@@ -16059,20 +16256,38 @@ Ember.ContainerView = Ember.View.extend({
|
|
16059
16256
|
}, this);
|
16060
16257
|
|
16061
16258
|
var currentView = get(this, 'currentView');
|
16062
|
-
if (currentView)
|
16259
|
+
if (currentView) {
|
16260
|
+
_childViews.push(this.createChildView(currentView));
|
16261
|
+
}
|
16262
|
+
},
|
16063
16263
|
|
16064
|
-
|
16065
|
-
|
16264
|
+
replace: function(idx, removedCount, addedViews) {
|
16265
|
+
var addedCount = addedViews ? get(addedViews, 'length') : 0;
|
16066
16266
|
|
16067
|
-
|
16068
|
-
|
16069
|
-
|
16070
|
-
|
16071
|
-
|
16072
|
-
|
16073
|
-
|
16267
|
+
this.arrayContentWillChange(idx, removedCount, addedCount);
|
16268
|
+
this.childViewsWillChange(this._childViews, idx, removedCount);
|
16269
|
+
|
16270
|
+
if (addedCount === 0) {
|
16271
|
+
this._childViews.splice(idx, removedCount) ;
|
16272
|
+
} else {
|
16273
|
+
var args = [idx, removedCount].concat(addedViews);
|
16274
|
+
this._childViews.splice.apply(this._childViews, args);
|
16275
|
+
}
|
16276
|
+
|
16277
|
+
this.arrayContentDidChange(idx, removedCount, addedCount);
|
16278
|
+
this.childViewsDidChange(this._childViews, idx, removedCount, addedCount);
|
16279
|
+
|
16280
|
+
return this;
|
16281
|
+
},
|
16282
|
+
|
16283
|
+
objectAt: function(idx) {
|
16284
|
+
return this._childViews[idx];
|
16074
16285
|
},
|
16075
16286
|
|
16287
|
+
length: Ember.computed(function () {
|
16288
|
+
return this._childViews.length;
|
16289
|
+
}),
|
16290
|
+
|
16076
16291
|
/**
|
16077
16292
|
@private
|
16078
16293
|
|
@@ -16089,23 +16304,6 @@ Ember.ContainerView = Ember.View.extend({
|
|
16089
16304
|
|
16090
16305
|
instrumentName: 'render.container',
|
16091
16306
|
|
16092
|
-
/**
|
16093
|
-
@private
|
16094
|
-
|
16095
|
-
When the container view is destroyed, tear down the child views
|
16096
|
-
array observer.
|
16097
|
-
|
16098
|
-
@method willDestroy
|
16099
|
-
*/
|
16100
|
-
willDestroy: function() {
|
16101
|
-
get(this, 'childViews').removeArrayObserver(this, {
|
16102
|
-
willChange: 'childViewsWillChange',
|
16103
|
-
didChange: 'childViewsDidChange'
|
16104
|
-
});
|
16105
|
-
|
16106
|
-
this._super();
|
16107
|
-
},
|
16108
|
-
|
16109
16307
|
/**
|
16110
16308
|
@private
|
16111
16309
|
|
@@ -16121,12 +16319,19 @@ Ember.ContainerView = Ember.View.extend({
|
|
16121
16319
|
@param {Number} removed the number of child views removed
|
16122
16320
|
**/
|
16123
16321
|
childViewsWillChange: function(views, start, removed) {
|
16124
|
-
|
16322
|
+
this.propertyWillChange('childViews');
|
16125
16323
|
|
16126
|
-
|
16127
|
-
|
16324
|
+
if (removed > 0) {
|
16325
|
+
var changedViews = views.slice(start, start+removed);
|
16326
|
+
// transition to preRender before clearing parentView
|
16327
|
+
this.currentState.childViewsWillChange(this, views, start, removed);
|
16328
|
+
this.initializeViews(changedViews, null, null);
|
16329
|
+
}
|
16330
|
+
},
|
16128
16331
|
|
16129
|
-
|
16332
|
+
removeChild: function(child) {
|
16333
|
+
this.removeObject(child);
|
16334
|
+
return this;
|
16130
16335
|
},
|
16131
16336
|
|
16132
16337
|
/**
|
@@ -16147,16 +16352,12 @@ Ember.ContainerView = Ember.View.extend({
|
|
16147
16352
|
@param {Number} the number of child views added
|
16148
16353
|
*/
|
16149
16354
|
childViewsDidChange: function(views, start, removed, added) {
|
16150
|
-
|
16151
|
-
|
16152
|
-
|
16153
|
-
|
16154
|
-
|
16155
|
-
|
16156
|
-
this.initializeViews(changedViews, this, get(this, 'templateData'));
|
16157
|
-
|
16158
|
-
// Let the current state handle the changes
|
16159
|
-
this.currentState.childViewsDidChange(this, views, start, added);
|
16355
|
+
if (added > 0) {
|
16356
|
+
var changedViews = views.slice(start, start+added);
|
16357
|
+
this.initializeViews(changedViews, this, get(this, 'templateData'));
|
16358
|
+
this.currentState.childViewsDidChange(this, views, start, added);
|
16359
|
+
}
|
16360
|
+
this.propertyDidChange('childViews');
|
16160
16361
|
},
|
16161
16362
|
|
16162
16363
|
initializeViews: function(views, parentView, templateData) {
|
@@ -16172,21 +16373,16 @@ Ember.ContainerView = Ember.View.extend({
|
|
16172
16373
|
currentView: null,
|
16173
16374
|
|
16174
16375
|
_currentViewWillChange: Ember.beforeObserver(function() {
|
16175
|
-
var
|
16176
|
-
currentView = get(this, 'currentView');
|
16177
|
-
|
16376
|
+
var currentView = get(this, 'currentView');
|
16178
16377
|
if (currentView) {
|
16179
16378
|
currentView.destroy();
|
16180
|
-
childViews.removeObject(currentView);
|
16181
16379
|
}
|
16182
16380
|
}, 'currentView'),
|
16183
16381
|
|
16184
16382
|
_currentViewDidChange: Ember.observer(function() {
|
16185
|
-
var
|
16186
|
-
currentView = get(this, 'currentView');
|
16187
|
-
|
16383
|
+
var currentView = get(this, 'currentView');
|
16188
16384
|
if (currentView) {
|
16189
|
-
|
16385
|
+
this.pushObject(currentView);
|
16190
16386
|
}
|
16191
16387
|
}, 'currentView'),
|
16192
16388
|
|
@@ -16219,7 +16415,7 @@ Ember.merge(states.hasElement, {
|
|
16219
16415
|
},
|
16220
16416
|
|
16221
16417
|
ensureChildrenAreInDOM: function(view) {
|
16222
|
-
var childViews = view.
|
16418
|
+
var childViews = view._childViews, i, len, childView, previous, buffer;
|
16223
16419
|
for (i = 0, len = childViews.length; i < len; i++) {
|
16224
16420
|
childView = childViews[i];
|
16225
16421
|
buffer = childView.renderToBufferIfNeeded();
|
@@ -16484,6 +16680,10 @@ Ember.CollectionView = Ember.ContainerView.extend(
|
|
16484
16680
|
if (content) { content.removeArrayObserver(this); }
|
16485
16681
|
|
16486
16682
|
this._super();
|
16683
|
+
|
16684
|
+
if (this._createdEmptyView) {
|
16685
|
+
this._createdEmptyView.destroy();
|
16686
|
+
}
|
16487
16687
|
},
|
16488
16688
|
|
16489
16689
|
arrayWillChange: function(content, start, removedCount) {
|
@@ -16497,9 +16697,9 @@ Ember.CollectionView = Ember.ContainerView.extend(
|
|
16497
16697
|
// Loop through child views that correspond with the removed items.
|
16498
16698
|
// Note that we loop from the end of the array to the beginning because
|
16499
16699
|
// we are mutating it as we go.
|
16500
|
-
var childViews =
|
16700
|
+
var childViews = this._childViews, childView, idx, len;
|
16501
16701
|
|
16502
|
-
len =
|
16702
|
+
len = this._childViews.length;
|
16503
16703
|
|
16504
16704
|
var removingAll = removedCount === len;
|
16505
16705
|
|
@@ -16529,7 +16729,6 @@ Ember.CollectionView = Ember.ContainerView.extend(
|
|
16529
16729
|
*/
|
16530
16730
|
arrayDidChange: function(content, start, removed, added) {
|
16531
16731
|
var itemViewClass = get(this, 'itemViewClass'),
|
16532
|
-
childViews = get(this, 'childViews'),
|
16533
16732
|
addedViews = [], view, item, idx, len, itemTagName;
|
16534
16733
|
|
16535
16734
|
if ('string' === typeof itemViewClass) {
|
@@ -16553,11 +16752,15 @@ Ember.CollectionView = Ember.ContainerView.extend(
|
|
16553
16752
|
var emptyView = get(this, 'emptyView');
|
16554
16753
|
if (!emptyView) { return; }
|
16555
16754
|
|
16755
|
+
var isClass = Ember.CoreView.detect(emptyView);
|
16756
|
+
|
16556
16757
|
emptyView = this.createChildView(emptyView);
|
16557
16758
|
addedViews.push(emptyView);
|
16558
16759
|
set(this, 'emptyView', emptyView);
|
16760
|
+
|
16761
|
+
if (isClass) { this._createdEmptyView = emptyView; }
|
16559
16762
|
}
|
16560
|
-
|
16763
|
+
this.replace(start, 0, addedViews);
|
16561
16764
|
},
|
16562
16765
|
|
16563
16766
|
createChildView: function(view, attrs) {
|
@@ -17169,6 +17372,8 @@ Ember.Handlebars.JavaScriptCompiler.prototype.appendToBuffer = function(string)
|
|
17169
17372
|
return "data.buffer.push("+string+");";
|
17170
17373
|
};
|
17171
17374
|
|
17375
|
+
var prefix = "ember" + (+new Date()), incr = 1;
|
17376
|
+
|
17172
17377
|
/**
|
17173
17378
|
@private
|
17174
17379
|
|
@@ -17181,8 +17386,11 @@ Ember.Handlebars.JavaScriptCompiler.prototype.appendToBuffer = function(string)
|
|
17181
17386
|
@param mustache
|
17182
17387
|
*/
|
17183
17388
|
Ember.Handlebars.Compiler.prototype.mustache = function(mustache) {
|
17184
|
-
if (mustache.
|
17185
|
-
|
17389
|
+
if (mustache.isHelper && mustache.id.string === 'control') {
|
17390
|
+
mustache.hash = mustache.hash || new Handlebars.AST.HashNode([]);
|
17391
|
+
mustache.hash.pairs.push(["controlID", new Handlebars.AST.StringNode(prefix + incr++)]);
|
17392
|
+
} else if (mustache.params.length || mustache.hash) {
|
17393
|
+
// no changes required
|
17186
17394
|
} else {
|
17187
17395
|
var id = new Handlebars.AST.IdNode(['_triageMustache']);
|
17188
17396
|
|
@@ -17194,8 +17402,9 @@ Ember.Handlebars.Compiler.prototype.mustache = function(mustache) {
|
|
17194
17402
|
mustache.hash.pairs.push(["unescaped", new Handlebars.AST.StringNode("true")]);
|
17195
17403
|
}
|
17196
17404
|
mustache = new Handlebars.AST.MustacheNode([id].concat([mustache.id]), mustache.hash, !mustache.escaped);
|
17197
|
-
return Handlebars.Compiler.prototype.mustache.call(this, mustache);
|
17198
17405
|
}
|
17406
|
+
|
17407
|
+
return Handlebars.Compiler.prototype.mustache.call(this, mustache);
|
17199
17408
|
};
|
17200
17409
|
|
17201
17410
|
/**
|
@@ -17254,6 +17463,8 @@ if (Handlebars.compile) {
|
|
17254
17463
|
})();
|
17255
17464
|
|
17256
17465
|
(function() {
|
17466
|
+
var slice = Array.prototype.slice;
|
17467
|
+
|
17257
17468
|
/**
|
17258
17469
|
@private
|
17259
17470
|
|
@@ -17308,7 +17519,7 @@ var normalizePath = Ember.Handlebars.normalizePath = function(root, path, data)
|
|
17308
17519
|
@param {String} path The path to be lookedup
|
17309
17520
|
@param {Object} options The template's option hash
|
17310
17521
|
*/
|
17311
|
-
Ember.Handlebars.get = function(root, path, options) {
|
17522
|
+
var handlebarsGet = Ember.Handlebars.get = function(root, path, options) {
|
17312
17523
|
var data = options && options.data,
|
17313
17524
|
normalizedPath = normalizePath(root, path, data),
|
17314
17525
|
value;
|
@@ -17330,6 +17541,41 @@ Ember.Handlebars.get = function(root, path, options) {
|
|
17330
17541
|
};
|
17331
17542
|
Ember.Handlebars.getPath = Ember.deprecateFunc('`Ember.Handlebars.getPath` has been changed to `Ember.Handlebars.get` for consistency.', Ember.Handlebars.get);
|
17332
17543
|
|
17544
|
+
Ember.Handlebars.resolveParams = function(context, params, options) {
|
17545
|
+
var resolvedParams = [], types = options.types, param, type;
|
17546
|
+
|
17547
|
+
for (var i=0, l=params.length; i<l; i++) {
|
17548
|
+
param = params[i];
|
17549
|
+
type = types[i];
|
17550
|
+
|
17551
|
+
if (type === 'ID') {
|
17552
|
+
resolvedParams.push(handlebarsGet(context, param, options));
|
17553
|
+
} else {
|
17554
|
+
resolvedParams.push(param);
|
17555
|
+
}
|
17556
|
+
}
|
17557
|
+
|
17558
|
+
return resolvedParams;
|
17559
|
+
};
|
17560
|
+
|
17561
|
+
Ember.Handlebars.resolveHash = function(context, hash, options) {
|
17562
|
+
var resolvedHash = {}, types = options.hashTypes, type;
|
17563
|
+
|
17564
|
+
for (var key in hash) {
|
17565
|
+
if (!hash.hasOwnProperty(key)) { continue; }
|
17566
|
+
|
17567
|
+
type = types[key];
|
17568
|
+
|
17569
|
+
if (type === 'ID') {
|
17570
|
+
resolvedHash[key] = handlebarsGet(context, hash[key], options);
|
17571
|
+
} else {
|
17572
|
+
resolvedHash[key] = hash[key];
|
17573
|
+
}
|
17574
|
+
}
|
17575
|
+
|
17576
|
+
return resolvedHash;
|
17577
|
+
};
|
17578
|
+
|
17333
17579
|
/**
|
17334
17580
|
@private
|
17335
17581
|
|
@@ -17399,6 +17645,18 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) {
|
|
17399
17645
|
{{repeat text count=3}}
|
17400
17646
|
```
|
17401
17647
|
|
17648
|
+
## Example with bound options
|
17649
|
+
|
17650
|
+
Bound hash options are also supported. Example:
|
17651
|
+
|
17652
|
+
```handlebars
|
17653
|
+
{{repeat text countBinding="numRepeats"}}
|
17654
|
+
```
|
17655
|
+
|
17656
|
+
In this example, count will be bound to the value of
|
17657
|
+
the `numRepeats` property on the context. If that property
|
17658
|
+
changes, the helper will be re-rendered.
|
17659
|
+
|
17402
17660
|
## Example with extra dependencies
|
17403
17661
|
|
17404
17662
|
The `Ember.Handlebars.registerBoundHelper` method takes a variable length
|
@@ -17411,6 +17669,37 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) {
|
|
17411
17669
|
}, 'name');
|
17412
17670
|
```
|
17413
17671
|
|
17672
|
+
## Example with multiple bound properties
|
17673
|
+
|
17674
|
+
`Ember.Handlebars.registerBoundHelper` supports binding to
|
17675
|
+
multiple properties, e.g.:
|
17676
|
+
|
17677
|
+
```javascript
|
17678
|
+
Ember.Handlebars.registerBoundHelper('concatenate', function() {
|
17679
|
+
var values = arguments[arguments.length - 1];
|
17680
|
+
return values.join('||');
|
17681
|
+
});
|
17682
|
+
```
|
17683
|
+
|
17684
|
+
Which allows for template syntax such as {{concatenate prop1 prop2}} or
|
17685
|
+
{{concatenate prop1 prop2 prop3}}. If any of the properties change,
|
17686
|
+
the helpr will re-render. Note that dependency keys cannot be
|
17687
|
+
using in conjunction with multi-property helpers, since it is ambiguous
|
17688
|
+
which property the dependent keys would belong to.
|
17689
|
+
|
17690
|
+
## Use with unbound helper
|
17691
|
+
|
17692
|
+
The {{unbound}} helper can be used with bound helper invocations
|
17693
|
+
to render them in their unbound form, e.g.
|
17694
|
+
|
17695
|
+
```handlebars
|
17696
|
+
{{unbound capitalize name}}
|
17697
|
+
```
|
17698
|
+
|
17699
|
+
In this example, if the name property changes, the helper
|
17700
|
+
will not re-render.
|
17701
|
+
|
17702
|
+
|
17414
17703
|
@method registerBoundHelper
|
17415
17704
|
@for Ember.Handlebars
|
17416
17705
|
@param {String} name
|
@@ -17418,15 +17707,49 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) {
|
|
17418
17707
|
@param {String} dependentKeys*
|
17419
17708
|
*/
|
17420
17709
|
Ember.Handlebars.registerBoundHelper = function(name, fn) {
|
17421
|
-
var dependentKeys =
|
17422
|
-
|
17423
|
-
|
17710
|
+
var dependentKeys = slice.call(arguments, 2);
|
17711
|
+
|
17712
|
+
function helper() {
|
17713
|
+
var properties = slice.call(arguments, 0, -1),
|
17714
|
+
numProperties = properties.length,
|
17715
|
+
options = arguments[arguments.length - 1],
|
17716
|
+
normalizedProperties = [],
|
17717
|
+
data = options.data,
|
17718
|
+
hash = options.hash,
|
17424
17719
|
view = data.view,
|
17425
17720
|
currentContext = (options.contexts && options.contexts[0]) || this,
|
17426
|
-
|
17427
|
-
|
17721
|
+
normalized,
|
17722
|
+
pathRoot, path,
|
17723
|
+
loc, hashOption;
|
17724
|
+
|
17725
|
+
// Detect bound options (e.g. countBinding="otherCount")
|
17726
|
+
hash.boundOptions = {};
|
17727
|
+
for (hashOption in hash) {
|
17728
|
+
if (!hash.hasOwnProperty(hashOption)) { continue; }
|
17729
|
+
|
17730
|
+
if (Ember.IS_BINDING.test(hashOption) && typeof hash[hashOption] === 'string') {
|
17731
|
+
// Lop off 'Binding' suffix.
|
17732
|
+
hash.boundOptions[hashOption.slice(0, -7)] = hash[hashOption];
|
17733
|
+
}
|
17734
|
+
}
|
17735
|
+
|
17736
|
+
// Expose property names on data.properties object.
|
17737
|
+
data.properties = [];
|
17738
|
+
for (loc = 0; loc < numProperties; ++loc) {
|
17739
|
+
data.properties.push(properties[loc]);
|
17740
|
+
normalizedProperties.push(normalizePath(currentContext, properties[loc], data));
|
17741
|
+
}
|
17742
|
+
|
17743
|
+
if (data.isUnbound) {
|
17744
|
+
return evaluateUnboundHelper(this, fn, normalizedProperties, options);
|
17745
|
+
}
|
17746
|
+
|
17747
|
+
if (dependentKeys.length === 0) {
|
17748
|
+
return evaluateMultiPropertyBoundHelper(currentContext, fn, normalizedProperties, options);
|
17749
|
+
}
|
17750
|
+
|
17428
17751
|
|
17429
|
-
normalized =
|
17752
|
+
normalized = normalizedProperties[0];
|
17430
17753
|
|
17431
17754
|
pathRoot = normalized.root;
|
17432
17755
|
path = normalized.path;
|
@@ -17442,28 +17765,116 @@ Ember.Handlebars.registerBoundHelper = function(name, fn) {
|
|
17442
17765
|
|
17443
17766
|
view.appendChild(bindView);
|
17444
17767
|
|
17445
|
-
|
17446
|
-
Ember.run.scheduleOnce('render', bindView, 'rerender');
|
17447
|
-
};
|
17768
|
+
view.registerObserver(pathRoot, path, bindView, rerenderBoundHelperView);
|
17448
17769
|
|
17449
|
-
|
17450
|
-
|
17451
|
-
while(loc < dependentKeys.length) {
|
17452
|
-
Ember.addObserver(pathRoot, path + '.' + dependentKeys[loc], observer);
|
17453
|
-
loc += 1;
|
17770
|
+
for (var i=0, l=dependentKeys.length; i<l; i++) {
|
17771
|
+
view.registerObserver(pathRoot, path + '.' + dependentKeys[i], bindView, rerenderBoundHelperView);
|
17454
17772
|
}
|
17773
|
+
}
|
17455
17774
|
|
17456
|
-
|
17457
|
-
|
17458
|
-
loc = 0;
|
17459
|
-
while(loc < dependentKeys.length) {
|
17460
|
-
Ember.removeObserver(pathRoot, path + '.' + dependentKeys[loc], observer);
|
17461
|
-
loc += 1;
|
17462
|
-
}
|
17463
|
-
});
|
17464
|
-
});
|
17775
|
+
helper._rawFunction = fn;
|
17776
|
+
Ember.Handlebars.registerHelper(name, helper);
|
17465
17777
|
};
|
17466
17778
|
|
17779
|
+
/**
|
17780
|
+
@private
|
17781
|
+
|
17782
|
+
Renders the unbound form of an otherwise bound helper function.
|
17783
|
+
|
17784
|
+
@param {Function} fn
|
17785
|
+
@param {Object} context
|
17786
|
+
@param {Array} normalizedProperties
|
17787
|
+
@param {String} options
|
17788
|
+
*/
|
17789
|
+
function evaluateMultiPropertyBoundHelper(context, fn, normalizedProperties, options) {
|
17790
|
+
var numProperties = normalizedProperties.length,
|
17791
|
+
self = this,
|
17792
|
+
data = options.data,
|
17793
|
+
view = data.view,
|
17794
|
+
hash = options.hash,
|
17795
|
+
boundOptions = hash.boundOptions,
|
17796
|
+
watchedProperties,
|
17797
|
+
boundOption, bindView, loc, property, len;
|
17798
|
+
|
17799
|
+
bindView = new Ember._SimpleHandlebarsView(null, null, !hash.unescaped, data);
|
17800
|
+
bindView.normalizedValue = function() {
|
17801
|
+
var args = [], value, boundOption;
|
17802
|
+
|
17803
|
+
// Copy over bound options.
|
17804
|
+
for (boundOption in boundOptions) {
|
17805
|
+
if (!boundOptions.hasOwnProperty(boundOption)) { continue; }
|
17806
|
+
property = normalizePath(context, boundOptions[boundOption], data);
|
17807
|
+
bindView.path = property.path;
|
17808
|
+
bindView.pathRoot = property.root;
|
17809
|
+
hash[boundOption] = Ember._SimpleHandlebarsView.prototype.normalizedValue.call(bindView);
|
17810
|
+
}
|
17811
|
+
|
17812
|
+
for (loc = 0; loc < numProperties; ++loc) {
|
17813
|
+
property = normalizedProperties[loc];
|
17814
|
+
bindView.path = property.path;
|
17815
|
+
bindView.pathRoot = property.root;
|
17816
|
+
args.push(Ember._SimpleHandlebarsView.prototype.normalizedValue.call(bindView));
|
17817
|
+
}
|
17818
|
+
args.push(options);
|
17819
|
+
return fn.apply(context, args);
|
17820
|
+
};
|
17821
|
+
|
17822
|
+
view.appendChild(bindView);
|
17823
|
+
|
17824
|
+
// Assemble liast of watched properties that'll re-render this helper.
|
17825
|
+
watchedProperties = [];
|
17826
|
+
for (boundOption in boundOptions) {
|
17827
|
+
if (boundOptions.hasOwnProperty(boundOption)) {
|
17828
|
+
watchedProperties.push(normalizePath(context, boundOptions[boundOption], data));
|
17829
|
+
}
|
17830
|
+
}
|
17831
|
+
watchedProperties = watchedProperties.concat(normalizedProperties);
|
17832
|
+
|
17833
|
+
// Observe each property.
|
17834
|
+
for (loc = 0, len = watchedProperties.length; loc < len; ++loc) {
|
17835
|
+
property = watchedProperties[loc];
|
17836
|
+
view.registerObserver(property.root, property.path, bindView, rerenderBoundHelperView);
|
17837
|
+
}
|
17838
|
+
|
17839
|
+
}
|
17840
|
+
|
17841
|
+
/**
|
17842
|
+
@private
|
17843
|
+
|
17844
|
+
An observer function used with bound helpers which
|
17845
|
+
will schedule a re-render of the _SimpleHandlebarsView
|
17846
|
+
connected with the helper.
|
17847
|
+
*/
|
17848
|
+
function rerenderBoundHelperView() {
|
17849
|
+
Ember.run.scheduleOnce('render', this, 'rerender');
|
17850
|
+
}
|
17851
|
+
|
17852
|
+
/**
|
17853
|
+
@private
|
17854
|
+
|
17855
|
+
Renders the unbound form of an otherwise bound helper function.
|
17856
|
+
|
17857
|
+
@param {Function} fn
|
17858
|
+
@param {Object} context
|
17859
|
+
@param {Array} normalizedProperties
|
17860
|
+
@param {String} options
|
17861
|
+
*/
|
17862
|
+
function evaluateUnboundHelper(context, fn, normalizedProperties, options) {
|
17863
|
+
var args = [], hash = options.hash, boundOptions = hash.boundOptions, loc, len, property, boundOption;
|
17864
|
+
|
17865
|
+
for (boundOption in boundOptions) {
|
17866
|
+
if (!boundOptions.hasOwnProperty(boundOption)) { continue; }
|
17867
|
+
hash[boundOption] = Ember.Handlebars.get(context, boundOptions[boundOption], options);
|
17868
|
+
}
|
17869
|
+
|
17870
|
+
for(loc = 0, len = normalizedProperties.length; loc < len; ++loc) {
|
17871
|
+
property = normalizedProperties[loc];
|
17872
|
+
args.push(Ember.Handlebars.get(context, property.path, options));
|
17873
|
+
}
|
17874
|
+
args.push(options);
|
17875
|
+
return fn.apply(context, args);
|
17876
|
+
}
|
17877
|
+
|
17467
17878
|
/**
|
17468
17879
|
@private
|
17469
17880
|
|
@@ -17567,7 +17978,7 @@ var DOMManager = {
|
|
17567
17978
|
view.transitionTo('preRender');
|
17568
17979
|
|
17569
17980
|
Ember.run.schedule('render', this, function() {
|
17570
|
-
if (
|
17981
|
+
if (view.isDestroying) { return; }
|
17571
17982
|
|
17572
17983
|
view.clearRenderedChildren();
|
17573
17984
|
var buffer = view.renderToBuffer();
|
@@ -17988,20 +18399,16 @@ var EmberHandlebars = Ember.Handlebars, helpers = EmberHandlebars.helpers;
|
|
17988
18399
|
|
17989
18400
|
// Binds a property into the DOM. This will create a hook in DOM that the
|
17990
18401
|
// KVO system will look for and update if the property changes.
|
17991
|
-
function bind(property, options, preserveContext, shouldDisplay, valueNormalizer) {
|
18402
|
+
function bind(property, options, preserveContext, shouldDisplay, valueNormalizer, childProperties) {
|
17992
18403
|
var data = options.data,
|
17993
18404
|
fn = options.fn,
|
17994
18405
|
inverse = options.inverse,
|
17995
18406
|
view = data.view,
|
17996
18407
|
currentContext = this,
|
17997
|
-
|
17998
|
-
observer;
|
18408
|
+
normalized, observer, i;
|
17999
18409
|
|
18000
18410
|
normalized = normalizePath(currentContext, property, data);
|
18001
18411
|
|
18002
|
-
pathRoot = normalized.root;
|
18003
|
-
path = normalized.path;
|
18004
|
-
|
18005
18412
|
// Set up observers for observable objects
|
18006
18413
|
if ('object' === typeof this) {
|
18007
18414
|
if (data.insideGroup) {
|
@@ -18009,7 +18416,7 @@ function bind(property, options, preserveContext, shouldDisplay, valueNormalizer
|
|
18009
18416
|
Ember.run.once(view, 'rerender');
|
18010
18417
|
};
|
18011
18418
|
|
18012
|
-
var template, context, result = handlebarsGet(
|
18419
|
+
var template, context, result = handlebarsGet(currentContext, property, options);
|
18013
18420
|
|
18014
18421
|
result = valueNormalizer(result);
|
18015
18422
|
|
@@ -18031,8 +18438,8 @@ function bind(property, options, preserveContext, shouldDisplay, valueNormalizer
|
|
18031
18438
|
valueNormalizerFunc: valueNormalizer,
|
18032
18439
|
displayTemplate: fn,
|
18033
18440
|
inverseTemplate: inverse,
|
18034
|
-
path:
|
18035
|
-
pathRoot:
|
18441
|
+
path: property,
|
18442
|
+
pathRoot: currentContext,
|
18036
18443
|
previousContext: currentContext,
|
18037
18444
|
isEscaped: !options.hash.unescaped,
|
18038
18445
|
templateData: options.data
|
@@ -18049,17 +18456,18 @@ function bind(property, options, preserveContext, shouldDisplay, valueNormalizer
|
|
18049
18456
|
// tells the Ember._HandlebarsBoundView to re-render. If property
|
18050
18457
|
// is an empty string, we are printing the current context
|
18051
18458
|
// object ({{this}}) so updating it is not our responsibility.
|
18052
|
-
if (path !== '') {
|
18053
|
-
|
18054
|
-
|
18055
|
-
|
18056
|
-
|
18057
|
-
|
18459
|
+
if (normalized.path !== '') {
|
18460
|
+
view.registerObserver(normalized.root, normalized.path, observer);
|
18461
|
+
if (childProperties) {
|
18462
|
+
for (i=0; i<childProperties.length; i++) {
|
18463
|
+
view.registerObserver(normalized.root, normalized.path+'.'+childProperties[i], observer);
|
18464
|
+
}
|
18465
|
+
}
|
18058
18466
|
}
|
18059
18467
|
} else {
|
18060
18468
|
// The object is not observable, so just render it out and
|
18061
18469
|
// be done with it.
|
18062
|
-
data.buffer.push(handlebarsGet(
|
18470
|
+
data.buffer.push(handlebarsGet(currentContext, property, options));
|
18063
18471
|
}
|
18064
18472
|
}
|
18065
18473
|
|
@@ -18067,14 +18475,10 @@ function simpleBind(property, options) {
|
|
18067
18475
|
var data = options.data,
|
18068
18476
|
view = data.view,
|
18069
18477
|
currentContext = this,
|
18070
|
-
|
18071
|
-
observer;
|
18478
|
+
normalized, observer;
|
18072
18479
|
|
18073
18480
|
normalized = normalizePath(currentContext, property, data);
|
18074
18481
|
|
18075
|
-
pathRoot = normalized.root;
|
18076
|
-
path = normalized.path;
|
18077
|
-
|
18078
18482
|
// Set up observers for observable objects
|
18079
18483
|
if ('object' === typeof this) {
|
18080
18484
|
if (data.insideGroup) {
|
@@ -18082,12 +18486,12 @@ function simpleBind(property, options) {
|
|
18082
18486
|
Ember.run.once(view, 'rerender');
|
18083
18487
|
};
|
18084
18488
|
|
18085
|
-
var result = handlebarsGet(
|
18489
|
+
var result = handlebarsGet(currentContext, property, options);
|
18086
18490
|
if (result === null || result === undefined) { result = ""; }
|
18087
18491
|
data.buffer.push(result);
|
18088
18492
|
} else {
|
18089
18493
|
var bindView = new Ember._SimpleHandlebarsView(
|
18090
|
-
|
18494
|
+
property, currentContext, !options.hash.unescaped, options.data
|
18091
18495
|
);
|
18092
18496
|
|
18093
18497
|
bindView._parentView = view;
|
@@ -18102,17 +18506,13 @@ function simpleBind(property, options) {
|
|
18102
18506
|
// tells the Ember._HandlebarsBoundView to re-render. If property
|
18103
18507
|
// is an empty string, we are printing the current context
|
18104
18508
|
// object ({{this}}) so updating it is not our responsibility.
|
18105
|
-
if (path !== '') {
|
18106
|
-
|
18107
|
-
|
18108
|
-
view.one('willClearRender', function() {
|
18109
|
-
Ember.removeObserver(pathRoot, path, observer);
|
18110
|
-
});
|
18509
|
+
if (normalized.path !== '') {
|
18510
|
+
view.registerObserver(normalized.root, normalized.path, observer);
|
18111
18511
|
}
|
18112
18512
|
} else {
|
18113
18513
|
// The object is not observable, so just render it out and
|
18114
18514
|
// be done with it.
|
18115
|
-
data.buffer.push(handlebarsGet(
|
18515
|
+
data.buffer.push(handlebarsGet(currentContext, property, options));
|
18116
18516
|
}
|
18117
18517
|
}
|
18118
18518
|
|
@@ -18201,14 +18601,17 @@ EmberHandlebars.registerHelper('bind', function(property, options) {
|
|
18201
18601
|
EmberHandlebars.registerHelper('boundIf', function(property, fn) {
|
18202
18602
|
var context = (fn.contexts && fn.contexts[0]) || this;
|
18203
18603
|
var func = function(result) {
|
18204
|
-
|
18604
|
+
var truthy = result && get(result, 'isTruthy');
|
18605
|
+
if (typeof truthy === 'boolean') { return truthy; }
|
18606
|
+
|
18607
|
+
if (Ember.isArray(result)) {
|
18205
18608
|
return get(result, 'length') !== 0;
|
18206
18609
|
} else {
|
18207
18610
|
return !!result;
|
18208
18611
|
}
|
18209
18612
|
};
|
18210
18613
|
|
18211
|
-
return bind.call(context, property, fn, true, func, func);
|
18614
|
+
return bind.call(context, property, fn, true, func, func, ['isTruthy', 'length']);
|
18212
18615
|
});
|
18213
18616
|
|
18214
18617
|
/**
|
@@ -18442,22 +18845,19 @@ EmberHandlebars.registerHelper('bindAttr', function(options) {
|
|
18442
18845
|
// current value of the property as an attribute.
|
18443
18846
|
forEach.call(attrKeys, function(attr) {
|
18444
18847
|
var path = attrs[attr],
|
18445
|
-
|
18848
|
+
normalized;
|
18446
18849
|
|
18447
18850
|
|
18448
18851
|
normalized = normalizePath(ctx, path, options.data);
|
18449
18852
|
|
18450
|
-
|
18451
|
-
path = normalized.path;
|
18452
|
-
|
18453
|
-
var value = (path === 'this') ? pathRoot : handlebarsGet(pathRoot, path, options),
|
18853
|
+
var value = (path === 'this') ? normalized.root : handlebarsGet(ctx, path, options),
|
18454
18854
|
type = Ember.typeOf(value);
|
18455
18855
|
|
18456
18856
|
|
18457
18857
|
var observer, invoker;
|
18458
18858
|
|
18459
18859
|
observer = function observer() {
|
18460
|
-
var result = handlebarsGet(
|
18860
|
+
var result = handlebarsGet(ctx, path, options);
|
18461
18861
|
|
18462
18862
|
|
18463
18863
|
var elem = view.$("[data-bindattr-" + dataId + "='" + dataId + "']");
|
@@ -18467,7 +18867,7 @@ EmberHandlebars.registerHelper('bindAttr', function(options) {
|
|
18467
18867
|
// In that case, we can assume the template has been re-rendered
|
18468
18868
|
// and we need to clean up the observer.
|
18469
18869
|
if (!elem || elem.length === 0) {
|
18470
|
-
Ember.removeObserver(
|
18870
|
+
Ember.removeObserver(normalized.root, normalized.path, invoker);
|
18471
18871
|
return;
|
18472
18872
|
}
|
18473
18873
|
|
@@ -18482,11 +18882,7 @@ EmberHandlebars.registerHelper('bindAttr', function(options) {
|
|
18482
18882
|
// When the observer fires, find the element using the
|
18483
18883
|
// unique data id and update the attribute to the new value.
|
18484
18884
|
if (path !== 'this') {
|
18485
|
-
|
18486
|
-
|
18487
|
-
view.one('willClearRender', function() {
|
18488
|
-
Ember.removeObserver(pathRoot, path, invoker);
|
18489
|
-
});
|
18885
|
+
view.registerObserver(normalized.root, normalized.path, invoker);
|
18490
18886
|
}
|
18491
18887
|
|
18492
18888
|
// if this changes, also change the logic in ember-views/lib/views/view.js
|
@@ -18576,7 +18972,7 @@ EmberHandlebars.bindClasses = function(context, classBindings, view, bindAttrId,
|
|
18576
18972
|
// class name.
|
18577
18973
|
observer = function() {
|
18578
18974
|
// Get the current value of the property
|
18579
|
-
newClass = classStringForPath(
|
18975
|
+
newClass = classStringForPath(context, parsedPath, options);
|
18580
18976
|
elem = bindAttrId ? view.$("[data-bindattr-" + bindAttrId + "='" + bindAttrId + "']") : view.$();
|
18581
18977
|
|
18582
18978
|
// If we can't find the element anymore, a parent template has been
|
@@ -18605,16 +19001,12 @@ EmberHandlebars.bindClasses = function(context, classBindings, view, bindAttrId,
|
|
18605
19001
|
};
|
18606
19002
|
|
18607
19003
|
if (path !== '' && path !== 'this') {
|
18608
|
-
|
18609
|
-
|
18610
|
-
view.one('willClearRender', function() {
|
18611
|
-
Ember.removeObserver(pathRoot, path, invoker);
|
18612
|
-
});
|
19004
|
+
view.registerObserver(pathRoot, path, invoker);
|
18613
19005
|
}
|
18614
19006
|
|
18615
19007
|
// We've already setup the observer; now we just need to figure out the
|
18616
19008
|
// correct behavior right now on the first pass through.
|
18617
|
-
value = classStringForPath(
|
19009
|
+
value = classStringForPath(context, parsedPath, options);
|
18618
19010
|
|
18619
19011
|
if (value) {
|
18620
19012
|
ret.push(value);
|
@@ -19134,7 +19526,7 @@ Ember.Handlebars.registerHelper('collection', function(path, options) {
|
|
19134
19526
|
if (hash.hasOwnProperty(prop)) {
|
19135
19527
|
match = prop.match(/^item(.)(.*)$/);
|
19136
19528
|
|
19137
|
-
if(match) {
|
19529
|
+
if(match && prop !== 'itemController') {
|
19138
19530
|
// Convert itemShouldFoo -> shouldFoo
|
19139
19531
|
itemHash[match[1].toLowerCase() + match[2]] = hash[prop];
|
19140
19532
|
// Delete from hash as this will end up getting passed to the
|
@@ -19161,13 +19553,10 @@ Ember.Handlebars.registerHelper('collection', function(path, options) {
|
|
19161
19553
|
} else if (hash.emptyViewClass) {
|
19162
19554
|
emptyViewClass = handlebarsGet(this, hash.emptyViewClass, options);
|
19163
19555
|
}
|
19164
|
-
hash.emptyView = emptyViewClass;
|
19556
|
+
if (emptyViewClass) { hash.emptyView = emptyViewClass; }
|
19165
19557
|
|
19166
|
-
if
|
19167
|
-
itemHash._context = Ember.computed(
|
19168
|
-
return get(this, 'content');
|
19169
|
-
}).property('content');
|
19170
|
-
delete hash.eachHelper;
|
19558
|
+
if(!hash.keyword){
|
19559
|
+
itemHash._context = Ember.computed.alias('content');
|
19171
19560
|
}
|
19172
19561
|
|
19173
19562
|
var viewString = view.toString();
|
@@ -19200,13 +19589,31 @@ var handlebarsGet = Ember.Handlebars.get;
|
|
19200
19589
|
<div>{{unbound somePropertyThatDoesntChange}}</div>
|
19201
19590
|
```
|
19202
19591
|
|
19592
|
+
`unbound` can also be used in conjunction with a bound helper to
|
19593
|
+
render it in its unbound form:
|
19594
|
+
|
19595
|
+
```handlebars
|
19596
|
+
<div>{{unbound helperName somePropertyThatDoesntChange}}</div>
|
19597
|
+
```
|
19598
|
+
|
19203
19599
|
@method unbound
|
19204
19600
|
@for Ember.Handlebars.helpers
|
19205
19601
|
@param {String} property
|
19206
19602
|
@return {String} HTML string
|
19207
19603
|
*/
|
19208
19604
|
Ember.Handlebars.registerHelper('unbound', function(property, fn) {
|
19209
|
-
var
|
19605
|
+
var options = arguments[arguments.length - 1], helper, context, out;
|
19606
|
+
|
19607
|
+
if(arguments.length > 2) {
|
19608
|
+
// Unbound helper call.
|
19609
|
+
options.data.isUnbound = true;
|
19610
|
+
helper = Ember.Handlebars.helpers[arguments[0]] || Ember.Handlebars.helperMissing;
|
19611
|
+
out = helper.apply(this, Array.prototype.slice.call(arguments, 1));
|
19612
|
+
delete options.data.isUnbound;
|
19613
|
+
return out;
|
19614
|
+
}
|
19615
|
+
|
19616
|
+
context = (fn.contexts && fn.contexts[0]) || this;
|
19210
19617
|
return handlebarsGet(context, property, fn);
|
19211
19618
|
});
|
19212
19619
|
|
@@ -19272,6 +19679,44 @@ Ember.Handlebars.registerHelper('debugger', function() {
|
|
19272
19679
|
var get = Ember.get, set = Ember.set;
|
19273
19680
|
|
19274
19681
|
Ember.Handlebars.EachView = Ember.CollectionView.extend(Ember._Metamorph, {
|
19682
|
+
init: function() {
|
19683
|
+
var itemController = get(this, 'itemController');
|
19684
|
+
var binding;
|
19685
|
+
|
19686
|
+
if (itemController) {
|
19687
|
+
var controller = Ember.ArrayController.create();
|
19688
|
+
set(controller, 'itemController', itemController);
|
19689
|
+
set(controller, 'container', get(this, 'controller.container'));
|
19690
|
+
set(controller, '_eachView', this);
|
19691
|
+
set(controller, 'target', get(this, 'controller'));
|
19692
|
+
|
19693
|
+
this.disableContentObservers(function() {
|
19694
|
+
set(this, 'content', controller);
|
19695
|
+
binding = new Ember.Binding('content', '_eachView.dataSource').oneWay();
|
19696
|
+
binding.connect(controller);
|
19697
|
+
});
|
19698
|
+
|
19699
|
+
set(this, '_arrayController', controller);
|
19700
|
+
} else {
|
19701
|
+
this.disableContentObservers(function() {
|
19702
|
+
binding = new Ember.Binding('content', 'dataSource').oneWay();
|
19703
|
+
binding.connect(this);
|
19704
|
+
});
|
19705
|
+
}
|
19706
|
+
|
19707
|
+
return this._super();
|
19708
|
+
},
|
19709
|
+
|
19710
|
+
disableContentObservers: function(callback) {
|
19711
|
+
Ember.removeBeforeObserver(this, 'content', null, '_contentWillChange');
|
19712
|
+
Ember.removeObserver(this, 'content', null, '_contentDidChange');
|
19713
|
+
|
19714
|
+
callback.apply(this);
|
19715
|
+
|
19716
|
+
Ember.addBeforeObserver(this, 'content', null, '_contentWillChange');
|
19717
|
+
Ember.addObserver(this, 'content', null, '_contentDidChange');
|
19718
|
+
},
|
19719
|
+
|
19275
19720
|
itemViewClass: Ember._MetamorphView,
|
19276
19721
|
emptyViewClass: Ember._MetamorphView,
|
19277
19722
|
|
@@ -19282,6 +19727,7 @@ Ember.Handlebars.EachView = Ember.CollectionView.extend(Ember._Metamorph, {
|
|
19282
19727
|
// to insert keywords, it is responsible for cloning
|
19283
19728
|
// the keywords hash. This will be fixed momentarily.
|
19284
19729
|
var keyword = get(this, 'keyword');
|
19730
|
+
var content = get(view, 'content');
|
19285
19731
|
|
19286
19732
|
if (keyword) {
|
19287
19733
|
var data = get(view, 'templateData');
|
@@ -19290,14 +19736,28 @@ Ember.Handlebars.EachView = Ember.CollectionView.extend(Ember._Metamorph, {
|
|
19290
19736
|
data.keywords = view.cloneKeywords();
|
19291
19737
|
set(view, 'templateData', data);
|
19292
19738
|
|
19293
|
-
var content = get(view, 'content');
|
19294
|
-
|
19295
19739
|
// In this case, we do not bind, because the `content` of
|
19296
19740
|
// a #each item cannot change.
|
19297
19741
|
data.keywords[keyword] = content;
|
19298
19742
|
}
|
19299
19743
|
|
19744
|
+
// If {{#each}} is looping over an array of controllers,
|
19745
|
+
// point each child view at their respective controller.
|
19746
|
+
if (content && get(content, 'isController')) {
|
19747
|
+
set(view, 'controller', content);
|
19748
|
+
}
|
19749
|
+
|
19300
19750
|
return view;
|
19751
|
+
},
|
19752
|
+
|
19753
|
+
willDestroy: function() {
|
19754
|
+
var arrayController = get(this, '_arrayController');
|
19755
|
+
|
19756
|
+
if (arrayController) {
|
19757
|
+
arrayController.destroy();
|
19758
|
+
}
|
19759
|
+
|
19760
|
+
return this._super();
|
19301
19761
|
}
|
19302
19762
|
});
|
19303
19763
|
|
@@ -19391,7 +19851,8 @@ GroupedEach.prototype = {
|
|
19391
19851
|
|
19392
19852
|
/**
|
19393
19853
|
The `{{#each}}` helper loops over elements in a collection, rendering its
|
19394
|
-
block once for each item
|
19854
|
+
block once for each item. It is an extension of the base Handlebars `{{#each}}`
|
19855
|
+
helper:
|
19395
19856
|
|
19396
19857
|
```javascript
|
19397
19858
|
Developers = [{name: 'Yehuda'},{name: 'Tom'}, {name: 'Paul'}];
|
@@ -19423,12 +19884,20 @@ GroupedEach.prototype = {
|
|
19423
19884
|
{{this}}
|
19424
19885
|
{{/each}}
|
19425
19886
|
```
|
19887
|
+
### {{else}} condition
|
19888
|
+
`{{#each}}` can have a matching `{{else}}`. The contents of this block will render
|
19889
|
+
if the collection is empty.
|
19426
19890
|
|
19427
|
-
|
19428
|
-
|
19429
|
-
|
19430
|
-
|
19431
|
-
|
19891
|
+
```
|
19892
|
+
{{#each person in Developers}}
|
19893
|
+
{{person.name}}
|
19894
|
+
{{else}}
|
19895
|
+
<p>Sorry, nobody is available for this task.</p>
|
19896
|
+
{{/each}}
|
19897
|
+
```
|
19898
|
+
### Specifying a View class for items
|
19899
|
+
If you provide an `itemViewClass` option that references a view class
|
19900
|
+
with its own `template` you can omit the block.
|
19432
19901
|
|
19433
19902
|
The following template:
|
19434
19903
|
|
@@ -19454,8 +19923,6 @@ GroupedEach.prototype = {
|
|
19454
19923
|
App.AnItemView = Ember.View.extend({
|
19455
19924
|
template: Ember.Handlebars.compile("Greetings {{name}}")
|
19456
19925
|
});
|
19457
|
-
|
19458
|
-
App.initialize();
|
19459
19926
|
```
|
19460
19927
|
|
19461
19928
|
Will result in the HTML structure below
|
@@ -19467,11 +19934,39 @@ GroupedEach.prototype = {
|
|
19467
19934
|
<div class="ember-view">Greetings Sara</div>
|
19468
19935
|
</div>
|
19469
19936
|
```
|
19470
|
-
|
19937
|
+
|
19938
|
+
### Representing each item with a Controller.
|
19939
|
+
By default the controller lookup within an `{{#each}}` block will be
|
19940
|
+
the controller of the template where the `{{#each}}` was used. If each
|
19941
|
+
item needs to be presented by a custom controller you can provide a
|
19942
|
+
`itemController` option which references a controller by lookup name.
|
19943
|
+
Each item in the loop will be wrapped in an instance of this controller
|
19944
|
+
and the item itself will be set to the `content` property of that controller.
|
19945
|
+
|
19946
|
+
This is useful in cases where properties of model objects need transformation
|
19947
|
+
or synthesis for display:
|
19948
|
+
|
19949
|
+
```javascript
|
19950
|
+
App.DeveloperController = Ember.ObjectController.extend({
|
19951
|
+
isAvailableForHire: function(){
|
19952
|
+
return !this.get('content.isEmployed') && this.get('content.isSeekingWork');
|
19953
|
+
}.property('isEmployed', 'isSeekingWork')
|
19954
|
+
})
|
19955
|
+
```
|
19956
|
+
|
19957
|
+
```handlebars
|
19958
|
+
{{#each person in Developers itemController="developer"}}
|
19959
|
+
{{person.name}} {{#if person.isAvailableForHire}}Hire me!{{/if}}
|
19960
|
+
{{/each}}
|
19961
|
+
```
|
19962
|
+
|
19471
19963
|
@method each
|
19472
19964
|
@for Ember.Handlebars.helpers
|
19473
19965
|
@param [name] {String} name for item (used with `in`)
|
19474
19966
|
@param path {String} path
|
19967
|
+
@param [options] {Object} Handlebars key/value pairs of options
|
19968
|
+
@param [options.itemViewClass] {String} a path to a view class used for each item
|
19969
|
+
@param [options.itemController] {String} name of a controller to be created for each item
|
19475
19970
|
*/
|
19476
19971
|
Ember.Handlebars.registerHelper('each', function(path, options) {
|
19477
19972
|
if (arguments.length === 4) {
|
@@ -19484,11 +19979,9 @@ Ember.Handlebars.registerHelper('each', function(path, options) {
|
|
19484
19979
|
if (path === '') { path = "this"; }
|
19485
19980
|
|
19486
19981
|
options.hash.keyword = keywordName;
|
19487
|
-
} else {
|
19488
|
-
options.hash.eachHelper = 'each';
|
19489
19982
|
}
|
19490
19983
|
|
19491
|
-
options.hash.
|
19984
|
+
options.hash.dataSourceBinding = path;
|
19492
19985
|
// Set up emptyView as a metamorph with no tag
|
19493
19986
|
//options.hash.emptyViewClass = Ember._MetamorphView;
|
19494
19987
|
|
@@ -19844,7 +20337,7 @@ Ember.TextField = Ember.View.extend(Ember.TextSupport,
|
|
19844
20337
|
|
19845
20338
|
classNames: ['ember-text-field'],
|
19846
20339
|
tagName: "input",
|
19847
|
-
attributeBindings: ['type', 'value', 'size'],
|
20340
|
+
attributeBindings: ['type', 'value', 'size', 'pattern'],
|
19848
20341
|
|
19849
20342
|
/**
|
19850
20343
|
The `value` attribute of the input element. As the user inputs text, this
|
@@ -19874,6 +20367,15 @@ Ember.TextField = Ember.View.extend(Ember.TextSupport,
|
|
19874
20367
|
*/
|
19875
20368
|
size: null,
|
19876
20369
|
|
20370
|
+
/**
|
20371
|
+
The `pattern` the pattern attribute of input element.
|
20372
|
+
|
20373
|
+
@property pattern
|
20374
|
+
@type String
|
20375
|
+
@default null
|
20376
|
+
*/
|
20377
|
+
pattern: null,
|
20378
|
+
|
19877
20379
|
/**
|
19878
20380
|
The action to be sent when the user presses the return key.
|
19879
20381
|
|
@@ -19887,15 +20389,34 @@ Ember.TextField = Ember.View.extend(Ember.TextSupport,
|
|
19887
20389
|
*/
|
19888
20390
|
action: null,
|
19889
20391
|
|
19890
|
-
|
19891
|
-
|
20392
|
+
/**
|
20393
|
+
Whether they `keyUp` event that triggers an `action` to be sent continues
|
20394
|
+
propagating to other views.
|
20395
|
+
|
20396
|
+
By default, when the user presses the return key on their keyboard and
|
20397
|
+
the text field has an `action` set, the action will be sent to the view's
|
20398
|
+
controller and the key event will stop propagating.
|
20399
|
+
|
20400
|
+
If you would like parent views to receive the `keyUp` event even after an
|
20401
|
+
action has been dispatched, set `bubbles` to true.
|
20402
|
+
|
20403
|
+
@property bubbles
|
20404
|
+
@type Boolean
|
20405
|
+
@default false
|
20406
|
+
*/
|
20407
|
+
bubbles: false,
|
20408
|
+
|
20409
|
+
insertNewline: function(event) {
|
20410
|
+
var controller = get(this, 'controller'),
|
19892
20411
|
action = get(this, 'action');
|
19893
20412
|
|
19894
20413
|
if (action) {
|
19895
|
-
controller.send(action, get(this, 'value'));
|
19896
|
-
}
|
20414
|
+
controller.send(action, get(this, 'value'), this);
|
19897
20415
|
|
19898
|
-
|
20416
|
+
if (!get(this, 'bubbles')) {
|
20417
|
+
event.stopPropagation();
|
20418
|
+
}
|
20419
|
+
}
|
19899
20420
|
}
|
19900
20421
|
});
|
19901
20422
|
|
@@ -20369,30 +20890,37 @@ Ember.Select = Ember.View.extend(
|
|
20369
20890
|
tagName: 'select',
|
20370
20891
|
classNames: ['ember-select'],
|
20371
20892
|
defaultTemplate: Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) {
|
20893
|
+
this.compilerInfo = [2,'>= 1.0.0-rc.3'];
|
20372
20894
|
helpers = helpers || Ember.Handlebars.helpers; data = data || {};
|
20373
|
-
var buffer = '', stack1, escapeExpression=this.escapeExpression, self=this;
|
20895
|
+
var buffer = '', stack1, hashTypes, escapeExpression=this.escapeExpression, self=this;
|
20374
20896
|
|
20375
20897
|
function program1(depth0,data) {
|
20376
20898
|
|
20377
|
-
var buffer = '',
|
20899
|
+
var buffer = '', hashTypes;
|
20378
20900
|
data.buffer.push("<option value=\"\">");
|
20379
|
-
|
20380
|
-
data.buffer.push(escapeExpression(
|
20381
|
-
|
20901
|
+
hashTypes = {};
|
20902
|
+
data.buffer.push(escapeExpression(helpers._triageMustache.call(depth0, "view.prompt", {hash:{},contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data})));
|
20903
|
+
data.buffer.push("</option>");
|
20904
|
+
return buffer;
|
20905
|
+
}
|
20382
20906
|
|
20383
20907
|
function program3(depth0,data) {
|
20384
20908
|
|
20385
|
-
var
|
20386
|
-
|
20387
|
-
|
20388
|
-
|
20389
|
-
data
|
20909
|
+
var hashTypes;
|
20910
|
+
hashTypes = {'contentBinding': "STRING"};
|
20911
|
+
data.buffer.push(escapeExpression(helpers.view.call(depth0, "Ember.SelectOption", {hash:{
|
20912
|
+
'contentBinding': ("this")
|
20913
|
+
},contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data})));
|
20914
|
+
}
|
20390
20915
|
|
20391
|
-
|
20916
|
+
hashTypes = {};
|
20917
|
+
stack1 = helpers['if'].call(depth0, "view.prompt", {hash:{},inverse:self.noop,fn:self.program(1, program1, data),contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data});
|
20392
20918
|
if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
|
20393
|
-
|
20919
|
+
hashTypes = {};
|
20920
|
+
stack1 = helpers.each.call(depth0, "view.content", {hash:{},inverse:self.noop,fn:self.program(3, program3, data),contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data});
|
20394
20921
|
if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
|
20395
20922
|
return buffer;
|
20923
|
+
|
20396
20924
|
}),
|
20397
20925
|
attributeBindings: ['multiple', 'disabled', 'tabindex'],
|
20398
20926
|
|
@@ -21728,10 +22256,16 @@ define("router",
|
|
21728
22256
|
if (handler.setup) { handler.setup(context); }
|
21729
22257
|
});
|
21730
22258
|
|
22259
|
+
var aborted = false;
|
21731
22260
|
eachHandler(partition.entered, function(handler, context) {
|
22261
|
+
if (aborted) { return; }
|
21732
22262
|
if (handler.enter) { handler.enter(); }
|
21733
22263
|
setContext(handler, context);
|
21734
|
-
if (handler.setup) {
|
22264
|
+
if (handler.setup) {
|
22265
|
+
if (false === handler.setup(context)) {
|
22266
|
+
aborted = true;
|
22267
|
+
}
|
22268
|
+
}
|
21735
22269
|
});
|
21736
22270
|
|
21737
22271
|
if (router.didTransition) {
|
@@ -21855,21 +22389,23 @@ define("router",
|
|
21855
22389
|
function trigger(router, args) {
|
21856
22390
|
var currentHandlerInfos = router.currentHandlerInfos;
|
21857
22391
|
|
22392
|
+
var name = args.shift();
|
22393
|
+
|
21858
22394
|
if (!currentHandlerInfos) {
|
21859
|
-
throw new Error("Could not trigger event. There are no active handlers");
|
22395
|
+
throw new Error("Could not trigger event '" + name + "'. There are no active handlers");
|
21860
22396
|
}
|
21861
22397
|
|
21862
|
-
var name = args.shift();
|
21863
|
-
|
21864
22398
|
for (var i=currentHandlerInfos.length-1; i>=0; i--) {
|
21865
22399
|
var handlerInfo = currentHandlerInfos[i],
|
21866
22400
|
handler = handlerInfo.handler;
|
21867
22401
|
|
21868
22402
|
if (handler.events && handler.events[name]) {
|
21869
22403
|
handler.events[name].apply(handler, args);
|
21870
|
-
|
22404
|
+
return;
|
21871
22405
|
}
|
21872
22406
|
}
|
22407
|
+
|
22408
|
+
throw new Error("Nothing handled the event '" + name + "'.");
|
21873
22409
|
}
|
21874
22410
|
|
21875
22411
|
function setContext(handler, context) {
|
@@ -22015,7 +22551,7 @@ Ember.generateController = function(container, controllerName, context) {
|
|
22015
22551
|
var Router = requireModule("router");
|
22016
22552
|
var get = Ember.get, set = Ember.set, classify = Ember.String.classify;
|
22017
22553
|
|
22018
|
-
var DefaultView = Ember.
|
22554
|
+
var DefaultView = Ember._MetamorphView;
|
22019
22555
|
function setupLocation(router) {
|
22020
22556
|
var location = get(router, 'location'),
|
22021
22557
|
rootURL = get(router, 'rootURL');
|
@@ -22031,6 +22567,14 @@ function setupLocation(router) {
|
|
22031
22567
|
}
|
22032
22568
|
}
|
22033
22569
|
|
22570
|
+
/**
|
22571
|
+
The `Ember.Router` class manages the application state and URLs. Refer to
|
22572
|
+
the [routing guide](http://emberjs.com/guides/routing/) for documentation.
|
22573
|
+
|
22574
|
+
@class Router
|
22575
|
+
@namespace Ember
|
22576
|
+
@extends Ember.Object
|
22577
|
+
*/
|
22034
22578
|
Ember.Router = Ember.Object.extend({
|
22035
22579
|
location: 'hash',
|
22036
22580
|
|
@@ -22040,6 +22584,10 @@ Ember.Router = Ember.Object.extend({
|
|
22040
22584
|
setupLocation(this);
|
22041
22585
|
},
|
22042
22586
|
|
22587
|
+
url: Ember.computed(function() {
|
22588
|
+
return get(this, 'location').getURL();
|
22589
|
+
}),
|
22590
|
+
|
22043
22591
|
startRouting: function() {
|
22044
22592
|
this.router = this.router || this.constructor.map(Ember.K);
|
22045
22593
|
|
@@ -22053,15 +22601,18 @@ Ember.Router = Ember.Object.extend({
|
|
22053
22601
|
container.register('view', 'default', DefaultView);
|
22054
22602
|
container.register('view', 'toplevel', Ember.View.extend());
|
22055
22603
|
|
22056
|
-
router.handleURL(location.getURL());
|
22057
22604
|
location.onUpdateURL(function(url) {
|
22058
|
-
|
22605
|
+
self.handleURL(url);
|
22059
22606
|
});
|
22607
|
+
|
22608
|
+
this.handleURL(location.getURL());
|
22060
22609
|
},
|
22061
22610
|
|
22062
22611
|
didTransition: function(infos) {
|
22063
22612
|
// Don't do any further action here if we redirected
|
22064
|
-
|
22613
|
+
for (var i=0, l=infos.length; i<l; i++) {
|
22614
|
+
if (infos[i].handler.redirected) { return; }
|
22615
|
+
}
|
22065
22616
|
|
22066
22617
|
var appController = this.container.lookup('controller:application'),
|
22067
22618
|
path = routePath(infos);
|
@@ -22079,23 +22630,14 @@ Ember.Router = Ember.Object.extend({
|
|
22079
22630
|
this.notifyPropertyChange('url');
|
22080
22631
|
},
|
22081
22632
|
|
22082
|
-
transitionTo: function(
|
22083
|
-
var args = [].slice.call(arguments)
|
22084
|
-
|
22085
|
-
if (!this.router.hasRoute(passedName)) {
|
22086
|
-
name = args[0] = passedName + '.index';
|
22087
|
-
} else {
|
22088
|
-
name = passedName;
|
22089
|
-
}
|
22090
|
-
|
22091
|
-
|
22092
|
-
this.router.transitionTo.apply(this.router, args);
|
22093
|
-
this.notifyPropertyChange('url');
|
22633
|
+
transitionTo: function(name) {
|
22634
|
+
var args = [].slice.call(arguments);
|
22635
|
+
doTransition(this, 'transitionTo', args);
|
22094
22636
|
},
|
22095
22637
|
|
22096
22638
|
replaceWith: function() {
|
22097
|
-
|
22098
|
-
this
|
22639
|
+
var args = [].slice.call(arguments);
|
22640
|
+
doTransition(this, 'replaceWith', args);
|
22099
22641
|
},
|
22100
22642
|
|
22101
22643
|
generate: function() {
|
@@ -22109,11 +22651,7 @@ Ember.Router = Ember.Object.extend({
|
|
22109
22651
|
},
|
22110
22652
|
|
22111
22653
|
send: function(name, context) {
|
22112
|
-
|
22113
|
-
context = context.context;
|
22114
|
-
}
|
22115
|
-
|
22116
|
-
this.router.trigger(name, context);
|
22654
|
+
this.router.trigger.apply(this.router, arguments);
|
22117
22655
|
},
|
22118
22656
|
|
22119
22657
|
hasRoute: function(route) {
|
@@ -22230,6 +22768,20 @@ function setupRouter(emberRouter, router, location) {
|
|
22230
22768
|
};
|
22231
22769
|
}
|
22232
22770
|
|
22771
|
+
function doTransition(router, method, args) {
|
22772
|
+
var passedName = args[0], name;
|
22773
|
+
|
22774
|
+
if (!router.router.hasRoute(args[0])) {
|
22775
|
+
name = args[0] = passedName + '.index';
|
22776
|
+
} else {
|
22777
|
+
name = passedName;
|
22778
|
+
}
|
22779
|
+
|
22780
|
+
|
22781
|
+
router.router[method].apply(router.router, args);
|
22782
|
+
router.notifyPropertyChange('url');
|
22783
|
+
}
|
22784
|
+
|
22233
22785
|
Ember.Router.reopenClass({
|
22234
22786
|
map: function(callback) {
|
22235
22787
|
var router = this.router = new Router();
|
@@ -22259,12 +22811,70 @@ var get = Ember.get, set = Ember.set,
|
|
22259
22811
|
classify = Ember.String.classify,
|
22260
22812
|
decamelize = Ember.String.decamelize;
|
22261
22813
|
|
22814
|
+
/**
|
22815
|
+
The `Ember.Route` class is used to define individual routes. Refer to
|
22816
|
+
the [routing guide](http://emberjs.com/guides/routing/) for documentation.
|
22262
22817
|
|
22818
|
+
@class Route
|
22819
|
+
@namespace Ember
|
22820
|
+
@extends Ember.Object
|
22821
|
+
*/
|
22263
22822
|
Ember.Route = Ember.Object.extend({
|
22823
|
+
/**
|
22824
|
+
@private
|
22825
|
+
|
22826
|
+
@method exit
|
22827
|
+
*/
|
22264
22828
|
exit: function() {
|
22829
|
+
this.deactivate();
|
22265
22830
|
teardownView(this);
|
22266
22831
|
},
|
22267
22832
|
|
22833
|
+
/**
|
22834
|
+
@private
|
22835
|
+
|
22836
|
+
@method enter
|
22837
|
+
*/
|
22838
|
+
enter: function() {
|
22839
|
+
this.activate();
|
22840
|
+
},
|
22841
|
+
|
22842
|
+
/**
|
22843
|
+
The collection of functions keyed by name available on this route as
|
22844
|
+
action targets.
|
22845
|
+
|
22846
|
+
These functions will be invoked when a matching `{{action}}` is triggered
|
22847
|
+
from within a template and the application's current route is this route.
|
22848
|
+
|
22849
|
+
Events can also be invoked from other parts of your application via `Route#send`.
|
22850
|
+
|
22851
|
+
The context of event will be the this route.
|
22852
|
+
|
22853
|
+
@see {Ember.Route#send}
|
22854
|
+
@see {Handlebars.helpers.action}
|
22855
|
+
|
22856
|
+
@property events
|
22857
|
+
@type Hash
|
22858
|
+
@default null
|
22859
|
+
*/
|
22860
|
+
events: null,
|
22861
|
+
|
22862
|
+
/**
|
22863
|
+
This hook is executed when the router completely exits this route. It is
|
22864
|
+
not executed when the model for the route changes.
|
22865
|
+
|
22866
|
+
@method deactivate
|
22867
|
+
*/
|
22868
|
+
deactivate: Ember.K,
|
22869
|
+
|
22870
|
+
/**
|
22871
|
+
This hook is executed when the router enters the route for the first time.
|
22872
|
+
It is not executed when the model for the route changes.
|
22873
|
+
|
22874
|
+
@method activate
|
22875
|
+
*/
|
22876
|
+
activate: Ember.K,
|
22877
|
+
|
22268
22878
|
/**
|
22269
22879
|
Transition into another route. Optionally supply a model for the
|
22270
22880
|
route in question. The model will be serialized into the URL
|
@@ -22275,7 +22885,7 @@ Ember.Route = Ember.Object.extend({
|
|
22275
22885
|
@param {...Object} models the
|
22276
22886
|
*/
|
22277
22887
|
transitionTo: function() {
|
22278
|
-
this.
|
22888
|
+
if (this._checkingRedirect) { this.redirected = true; }
|
22279
22889
|
return this.router.transitionTo.apply(this.router, arguments);
|
22280
22890
|
},
|
22281
22891
|
|
@@ -22288,7 +22898,7 @@ Ember.Route = Ember.Object.extend({
|
|
22288
22898
|
@param {...Object} models the
|
22289
22899
|
*/
|
22290
22900
|
replaceWith: function() {
|
22291
|
-
this.
|
22901
|
+
if (this._checkingRedirect) { this.redirected = true; }
|
22292
22902
|
return this.router.replaceWith.apply(this.router, arguments);
|
22293
22903
|
},
|
22294
22904
|
|
@@ -22304,14 +22914,18 @@ Ember.Route = Ember.Object.extend({
|
|
22304
22914
|
@method setup
|
22305
22915
|
*/
|
22306
22916
|
setup: function(context) {
|
22307
|
-
this.
|
22917
|
+
this.redirected = false;
|
22918
|
+
this._checkingRedirect = true;
|
22919
|
+
|
22308
22920
|
this.redirect(context);
|
22309
22921
|
|
22310
|
-
|
22922
|
+
this._checkingRedirect = false;
|
22923
|
+
if (this.redirected) { return false; }
|
22311
22924
|
|
22312
22925
|
var controller = this.controllerFor(this.routeName, context);
|
22313
22926
|
|
22314
22927
|
if (controller) {
|
22928
|
+
this.controller = controller;
|
22315
22929
|
set(controller, 'model', context);
|
22316
22930
|
}
|
22317
22931
|
|
@@ -22386,16 +23000,18 @@ Ember.Route = Ember.Object.extend({
|
|
22386
23000
|
@param {Object} params the parameters extracted from the URL
|
22387
23001
|
*/
|
22388
23002
|
model: function(params) {
|
22389
|
-
var match, name, value;
|
23003
|
+
var match, name, sawParams, value;
|
22390
23004
|
|
22391
23005
|
for (var prop in params) {
|
22392
23006
|
if (match = prop.match(/^(.*)_id$/)) {
|
22393
23007
|
name = match[1];
|
22394
23008
|
value = params[prop];
|
22395
23009
|
}
|
23010
|
+
sawParams = true;
|
22396
23011
|
}
|
22397
23012
|
|
22398
|
-
if (!name) { return; }
|
23013
|
+
if (!name && sawParams) { return params; }
|
23014
|
+
else if (!name) { return; }
|
22399
23015
|
|
22400
23016
|
var className = classify(name),
|
22401
23017
|
namespace = this.router.namespace,
|
@@ -22442,7 +23058,12 @@ Ember.Route = Ember.Object.extend({
|
|
22442
23058
|
if (params.length !== 1) { return; }
|
22443
23059
|
|
22444
23060
|
var name = params[0], object = {};
|
22445
|
-
|
23061
|
+
|
23062
|
+
if (/_id$/.test(name)) {
|
23063
|
+
object[name] = get(model, 'id');
|
23064
|
+
} else {
|
23065
|
+
object[name] = model;
|
23066
|
+
}
|
22446
23067
|
|
22447
23068
|
return object;
|
22448
23069
|
},
|
@@ -22610,12 +23231,16 @@ Ember.Route = Ember.Object.extend({
|
|
22610
23231
|
|
22611
23232
|
if (!view && !template) { return; }
|
22612
23233
|
|
22613
|
-
this.lastRenderedTemplate = name;
|
22614
|
-
|
22615
23234
|
options = normalizeOptions(this, name, template, options);
|
22616
23235
|
view = setupView(view, container, options);
|
22617
23236
|
|
23237
|
+
if (options.outlet === 'main') { this.lastRenderedTemplate = name; }
|
23238
|
+
|
22618
23239
|
appendView(this, view, options);
|
23240
|
+
},
|
23241
|
+
|
23242
|
+
willDestroy: function() {
|
23243
|
+
teardownView(this);
|
22619
23244
|
}
|
22620
23245
|
});
|
22621
23246
|
|
@@ -22631,15 +23256,16 @@ function parentRoute(route) {
|
|
22631
23256
|
}
|
22632
23257
|
}
|
22633
23258
|
|
22634
|
-
function parentTemplate(route) {
|
23259
|
+
function parentTemplate(route, isRecursive) {
|
22635
23260
|
var parent = parentRoute(route), template;
|
22636
23261
|
|
22637
23262
|
if (!parent) { return; }
|
22638
23263
|
|
23264
|
+
|
22639
23265
|
if (template = parent.lastRenderedTemplate) {
|
22640
23266
|
return template;
|
22641
23267
|
} else {
|
22642
|
-
return parentTemplate(parent);
|
23268
|
+
return parentTemplate(parent, true);
|
22643
23269
|
}
|
22644
23270
|
}
|
22645
23271
|
|
@@ -22650,6 +23276,7 @@ function normalizeOptions(route, name, template, options) {
|
|
22650
23276
|
options.name = name;
|
22651
23277
|
options.template = template;
|
22652
23278
|
|
23279
|
+
|
22653
23280
|
var controller = options.controller, namedController;
|
22654
23281
|
|
22655
23282
|
if (options.controller) {
|
@@ -22676,6 +23303,8 @@ function setupView(view, container, options) {
|
|
22676
23303
|
|
22677
23304
|
if (!get(view, 'templateName')) {
|
22678
23305
|
set(view, 'template', options.template);
|
23306
|
+
|
23307
|
+
set(view, '_debugTemplateName', options.name);
|
22679
23308
|
}
|
22680
23309
|
|
22681
23310
|
set(view, 'renderedName', options.name);
|
@@ -22698,7 +23327,7 @@ function appendView(route, view, options) {
|
|
22698
23327
|
}
|
22699
23328
|
|
22700
23329
|
function teardownTopLevel(view) {
|
22701
|
-
return function() { view.
|
23330
|
+
return function() { view.destroy(); };
|
22702
23331
|
}
|
22703
23332
|
|
22704
23333
|
function teardownOutlet(parentView, outlet) {
|
@@ -22723,10 +23352,15 @@ function teardownView(route) {
|
|
22723
23352
|
|
22724
23353
|
|
22725
23354
|
(function() {
|
23355
|
+
/**
|
23356
|
+
@module ember
|
23357
|
+
@submodule ember-routing
|
23358
|
+
*/
|
23359
|
+
|
22726
23360
|
var get = Ember.get, set = Ember.set;
|
22727
23361
|
Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
22728
23362
|
|
22729
|
-
var
|
23363
|
+
var resolveParams = Ember.Handlebars.resolveParams,
|
22730
23364
|
isSimpleClick = Ember.ViewUtils.isSimpleClick;
|
22731
23365
|
|
22732
23366
|
function fullRouteName(router, name) {
|
@@ -22737,8 +23371,11 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22737
23371
|
return name;
|
22738
23372
|
}
|
22739
23373
|
|
22740
|
-
function resolvedPaths(
|
22741
|
-
|
23374
|
+
function resolvedPaths(options) {
|
23375
|
+
var types = options.options.types.slice(1),
|
23376
|
+
data = options.options.data;
|
23377
|
+
|
23378
|
+
return resolveParams(options.context, options.params, { types: types, data: data });
|
22742
23379
|
}
|
22743
23380
|
|
22744
23381
|
function args(linkView, router, route) {
|
@@ -22748,7 +23385,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22748
23385
|
|
22749
23386
|
|
22750
23387
|
var ret = [ routeName ];
|
22751
|
-
return ret.concat(
|
23388
|
+
return ret.concat(resolvedPaths(linkView.parameters));
|
22752
23389
|
}
|
22753
23390
|
|
22754
23391
|
var LinkView = Ember.View.extend({
|
@@ -22761,9 +23398,15 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22761
23398
|
attributeBindings: ['href', 'title'],
|
22762
23399
|
classNameBindings: 'active',
|
22763
23400
|
|
23401
|
+
// Even though this isn't a virtual view, we want to treat it as if it is
|
23402
|
+
// so that you can access the parent with {{view.prop}}
|
23403
|
+
concreteView: Ember.computed(function() {
|
23404
|
+
return get(this, 'parentView');
|
23405
|
+
}).property('parentView').volatile(),
|
23406
|
+
|
22764
23407
|
active: Ember.computed(function() {
|
22765
23408
|
var router = this.get('router'),
|
22766
|
-
params = resolvedPaths(this),
|
23409
|
+
params = resolvedPaths(this.parameters),
|
22767
23410
|
currentWithIndex = this.currentWhen + '.index',
|
22768
23411
|
isActive = router.isActive.apply(router, [this.currentWhen].concat(params)) ||
|
22769
23412
|
router.isActive.apply(router, [currentWithIndex].concat(params));
|
@@ -22798,9 +23441,16 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22798
23441
|
|
22799
23442
|
LinkView.toString = function() { return "LinkView"; };
|
22800
23443
|
|
23444
|
+
/**
|
23445
|
+
@method linkTo
|
23446
|
+
@for Ember.Handlebars.helpers
|
23447
|
+
@param {String} routeName
|
23448
|
+
@param {Object} [context]*
|
23449
|
+
@return {String} HTML string
|
23450
|
+
*/
|
22801
23451
|
Ember.Handlebars.registerHelper('linkTo', function(name) {
|
22802
23452
|
var options = [].slice.call(arguments, -1)[0];
|
22803
|
-
var
|
23453
|
+
var params = [].slice.call(arguments, 1, -1);
|
22804
23454
|
|
22805
23455
|
var hash = options.hash;
|
22806
23456
|
|
@@ -22808,9 +23458,9 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22808
23458
|
hash.currentWhen = hash.currentWhen || name;
|
22809
23459
|
|
22810
23460
|
hash.parameters = {
|
22811
|
-
|
22812
|
-
|
22813
|
-
|
23461
|
+
context: this,
|
23462
|
+
options: options,
|
23463
|
+
params: params
|
22814
23464
|
};
|
22815
23465
|
|
22816
23466
|
return Ember.Handlebars.helpers.view.call(this, LinkView, options);
|
@@ -22894,45 +23544,6 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22894
23544
|
|
22895
23545
|
return Handlebars.helpers.view.call(this, Handlebars.OutletView, options);
|
22896
23546
|
});
|
22897
|
-
|
22898
|
-
Ember.View.reopen({
|
22899
|
-
init: function() {
|
22900
|
-
set(this, '_outlets', {});
|
22901
|
-
this._super();
|
22902
|
-
},
|
22903
|
-
|
22904
|
-
connectOutlet: function(outletName, view) {
|
22905
|
-
var outlets = get(this, '_outlets'),
|
22906
|
-
container = get(this, 'container'),
|
22907
|
-
router = container && container.lookup('router:main'),
|
22908
|
-
oldView = get(outlets, outletName),
|
22909
|
-
renderedName = get(view, 'renderedName');
|
22910
|
-
|
22911
|
-
set(outlets, outletName, view);
|
22912
|
-
|
22913
|
-
if (router) {
|
22914
|
-
if (oldView) {
|
22915
|
-
router._disconnectActiveView(oldView);
|
22916
|
-
}
|
22917
|
-
if (renderedName) {
|
22918
|
-
router._connectActiveView(renderedName, view);
|
22919
|
-
}
|
22920
|
-
}
|
22921
|
-
},
|
22922
|
-
|
22923
|
-
disconnectOutlet: function(outletName) {
|
22924
|
-
var outlets = get(this, '_outlets'),
|
22925
|
-
container = get(this, 'container'),
|
22926
|
-
router = container && container.lookup('router:main'),
|
22927
|
-
view = get(outlets, outletName);
|
22928
|
-
|
22929
|
-
set(outlets, outletName, null);
|
22930
|
-
|
22931
|
-
if (router && view) {
|
22932
|
-
router._disconnectActiveView(view);
|
22933
|
-
}
|
22934
|
-
}
|
22935
|
-
});
|
22936
23547
|
});
|
22937
23548
|
|
22938
23549
|
})();
|
@@ -22948,17 +23559,34 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22948
23559
|
var get = Ember.get, set = Ember.set;
|
22949
23560
|
Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
22950
23561
|
|
22951
|
-
|
23562
|
+
/**
|
23563
|
+
Renders the named template in the current context using the singleton
|
23564
|
+
instance of the same-named controller.
|
23565
|
+
|
23566
|
+
If a view class with the same name exists, uses the view class.
|
23567
|
+
|
23568
|
+
If a `model` is specified, it becomes the model for that controller.
|
22952
23569
|
|
22953
|
-
|
23570
|
+
The default target for `{{action}}`s in the rendered template is the
|
23571
|
+
named controller.
|
23572
|
+
|
23573
|
+
@method action
|
23574
|
+
@for Ember.Handlebars.helpers
|
23575
|
+
@param {String} actionName
|
23576
|
+
@param {Object?} model
|
23577
|
+
@param {Hash} options
|
23578
|
+
*/
|
23579
|
+
Ember.Handlebars.registerHelper('render', function(name, contextString, options) {
|
23580
|
+
|
23581
|
+
var container, router, controller, view, context;
|
22954
23582
|
|
22955
23583
|
if (arguments.length === 2) {
|
22956
|
-
options =
|
22957
|
-
|
23584
|
+
options = contextString;
|
23585
|
+
contextString = undefined;
|
22958
23586
|
}
|
22959
23587
|
|
22960
|
-
if (typeof
|
22961
|
-
context = Ember.Handlebars.get(options.contexts[1],
|
23588
|
+
if (typeof contextString === 'string') {
|
23589
|
+
context = Ember.Handlebars.get(options.contexts[1], contextString, options);
|
22962
23590
|
}
|
22963
23591
|
|
22964
23592
|
name = name.replace(/\//g, '.');
|
@@ -22978,6 +23606,14 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22978
23606
|
controller.set('model', context);
|
22979
23607
|
}
|
22980
23608
|
|
23609
|
+
var root = options.contexts[1];
|
23610
|
+
|
23611
|
+
if (root) {
|
23612
|
+
view.registerObserver(root, contextString, function() {
|
23613
|
+
controller.set('model', Ember.Handlebars.get(root, contextString, options));
|
23614
|
+
});
|
23615
|
+
}
|
23616
|
+
|
22981
23617
|
controller.set('target', options.data.keywords.controller);
|
22982
23618
|
|
22983
23619
|
options.hash.viewName = Ember.String.camelize(name);
|
@@ -23004,7 +23640,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23004
23640
|
*/
|
23005
23641
|
Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
23006
23642
|
|
23007
|
-
var
|
23643
|
+
var resolveParams = Ember.Handlebars.resolveParams,
|
23008
23644
|
isSimpleClick = Ember.ViewUtils.isSimpleClick;
|
23009
23645
|
|
23010
23646
|
var EmberHandlebars = Ember.Handlebars,
|
@@ -23016,7 +23652,11 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23016
23652
|
function args(options, actionName) {
|
23017
23653
|
var ret = [];
|
23018
23654
|
if (actionName) { ret.push(actionName); }
|
23019
|
-
|
23655
|
+
|
23656
|
+
var types = options.options.types.slice(1),
|
23657
|
+
data = options.options.data;
|
23658
|
+
|
23659
|
+
return ret.concat(resolveParams(options.context, options.params, { types: types, data: data }));
|
23020
23660
|
}
|
23021
23661
|
|
23022
23662
|
var ActionHelper = EmberHandlebars.ActionHelper = {
|
@@ -23040,12 +23680,20 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23040
23680
|
contexts = options.contexts,
|
23041
23681
|
target = options.target;
|
23042
23682
|
|
23043
|
-
if (target.
|
23044
|
-
|
23683
|
+
if (target.target) {
|
23684
|
+
target = handlebarsGet(target.root, target.target, target.options);
|
23045
23685
|
} else {
|
23046
|
-
|
23047
|
-
return target[actionName].apply(target, args(options));
|
23686
|
+
target = target.root;
|
23048
23687
|
}
|
23688
|
+
|
23689
|
+
Ember.run(function() {
|
23690
|
+
if (target.send) {
|
23691
|
+
target.send.apply(target, args(options.parameters, actionName));
|
23692
|
+
} else {
|
23693
|
+
|
23694
|
+
target[actionName].apply(target, args(options.parameters));
|
23695
|
+
}
|
23696
|
+
});
|
23049
23697
|
}
|
23050
23698
|
};
|
23051
23699
|
|
@@ -23225,7 +23873,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23225
23873
|
@method action
|
23226
23874
|
@for Ember.Handlebars.helpers
|
23227
23875
|
@param {String} actionName
|
23228
|
-
@param {Object
|
23876
|
+
@param {Object} [context]*
|
23229
23877
|
@param {Hash} options
|
23230
23878
|
*/
|
23231
23879
|
EmberHandlebars.registerHelper('action', function(actionName) {
|
@@ -23234,7 +23882,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23234
23882
|
|
23235
23883
|
var hash = options.hash,
|
23236
23884
|
view = options.data.view,
|
23237
|
-
|
23885
|
+
controller, link;
|
23238
23886
|
|
23239
23887
|
// create a hash to pass along to registerAction
|
23240
23888
|
var action = {
|
@@ -23242,20 +23890,23 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23242
23890
|
};
|
23243
23891
|
|
23244
23892
|
action.parameters = {
|
23245
|
-
|
23246
|
-
|
23247
|
-
|
23893
|
+
context: this,
|
23894
|
+
options: options,
|
23895
|
+
params: contexts
|
23248
23896
|
};
|
23249
23897
|
|
23250
23898
|
action.view = view = get(view, 'concreteView');
|
23251
23899
|
|
23900
|
+
var root, target;
|
23901
|
+
|
23252
23902
|
if (hash.target) {
|
23253
|
-
|
23903
|
+
root = this;
|
23904
|
+
target = hash.target;
|
23254
23905
|
} else if (controller = options.data.keywords.controller) {
|
23255
|
-
|
23906
|
+
root = controller;
|
23256
23907
|
}
|
23257
23908
|
|
23258
|
-
action.target = target;
|
23909
|
+
action.target = { root: root, target: target, options: options };
|
23259
23910
|
action.bubbles = hash.bubbles;
|
23260
23911
|
|
23261
23912
|
var actionId = ActionHelper.registerAction(actionName, action);
|
@@ -23268,108 +23919,124 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23268
23919
|
|
23269
23920
|
|
23270
23921
|
|
23271
|
-
(function() {
|
23272
|
-
|
23273
|
-
})();
|
23274
|
-
|
23275
|
-
|
23276
|
-
|
23277
23922
|
(function() {
|
23278
23923
|
/**
|
23279
23924
|
@module ember
|
23280
23925
|
@submodule ember-routing
|
23281
23926
|
*/
|
23282
23927
|
|
23283
|
-
|
23284
|
-
var
|
23285
|
-
controller: null,
|
23928
|
+
if (Ember.ENV.EXPERIMENTAL_CONTROL_HELPER) {
|
23929
|
+
var get = Ember.get, set = Ember.set;
|
23286
23930
|
|
23287
|
-
|
23288
|
-
|
23289
|
-
|
23290
|
-
dependency;
|
23931
|
+
/**
|
23932
|
+
The control helper is currently under development and is considered experimental.
|
23933
|
+
To enable it, set `ENV.EXPERIMENTAL_CONTROL_HELPER = true` before requiring Ember.
|
23291
23934
|
|
23292
|
-
|
23293
|
-
|
23294
|
-
|
23295
|
-
|
23296
|
-
|
23935
|
+
@method control
|
23936
|
+
@for Ember.Handlebars.helpers
|
23937
|
+
@param {String} path
|
23938
|
+
@param {String} modelPath
|
23939
|
+
@param {Hash} options
|
23940
|
+
@return {String} HTML string
|
23941
|
+
*/
|
23942
|
+
Ember.Handlebars.registerHelper('control', function(path, modelPath, options) {
|
23943
|
+
if (arguments.length === 2) {
|
23944
|
+
options = modelPath;
|
23945
|
+
modelPath = undefined;
|
23297
23946
|
}
|
23298
|
-
}
|
23299
|
-
});
|
23300
23947
|
|
23301
|
-
|
23302
|
-
concatenatedProperties: ['needs'],
|
23303
|
-
needs: [],
|
23948
|
+
var model;
|
23304
23949
|
|
23305
|
-
|
23306
|
-
|
23950
|
+
if (modelPath) {
|
23951
|
+
model = Ember.Handlebars.get(this, modelPath, options);
|
23952
|
+
}
|
23307
23953
|
|
23308
|
-
|
23309
|
-
|
23954
|
+
var controller = options.data.keywords.controller,
|
23955
|
+
view = options.data.keywords.view,
|
23956
|
+
children = get(controller, '_childContainers'),
|
23957
|
+
controlID = options.hash.controlID,
|
23958
|
+
container, subContainer;
|
23310
23959
|
|
23960
|
+
if (children.hasOwnProperty(controlID)) {
|
23961
|
+
subContainer = children[controlID];
|
23962
|
+
} else {
|
23963
|
+
container = get(controller, 'container'),
|
23964
|
+
subContainer = container.child();
|
23965
|
+
children[controlID] = subContainer;
|
23311
23966
|
}
|
23312
|
-
},
|
23313
23967
|
|
23314
|
-
|
23315
|
-
var target = get(this, 'target');
|
23968
|
+
var normalizedPath = path.replace(/\//g, '.');
|
23316
23969
|
|
23317
|
-
|
23318
|
-
|
23970
|
+
var childView = subContainer.lookup('view:' + normalizedPath) || subContainer.lookup('view:default'),
|
23971
|
+
childController = subContainer.lookup('controller:' + normalizedPath),
|
23972
|
+
childTemplate = subContainer.lookup('template:' + path);
|
23319
23973
|
|
23320
|
-
// TODO: Deprecate this, see https://github.com/emberjs/ember.js/issues/1785
|
23321
|
-
transitionTo: function() {
|
23322
|
-
return this.transitionToRoute.apply(this, arguments);
|
23323
|
-
},
|
23324
23974
|
|
23325
|
-
replaceRoute: function() {
|
23326
|
-
var target = get(this, 'target');
|
23327
23975
|
|
23328
|
-
|
23329
|
-
|
23330
|
-
|
23331
|
-
// TODO: Deprecate this, see https://github.com/emberjs/ember.js/issues/1785
|
23332
|
-
replaceWith: function() {
|
23333
|
-
return this.replaceRoute.apply(this, arguments);
|
23334
|
-
},
|
23976
|
+
set(childController, 'target', controller);
|
23977
|
+
set(childController, 'model', model);
|
23335
23978
|
|
23336
|
-
|
23337
|
-
|
23338
|
-
return container.lookup('controller:' + controllerName);
|
23339
|
-
},
|
23979
|
+
options.hash.template = childTemplate;
|
23980
|
+
options.hash.controller = childController;
|
23340
23981
|
|
23341
|
-
|
23342
|
-
|
23343
|
-
|
23344
|
-
|
23345
|
-
return get(this, 'content');
|
23982
|
+
function observer() {
|
23983
|
+
var model = Ember.Handlebars.get(this, modelPath, options);
|
23984
|
+
set(childController, 'model', model);
|
23985
|
+
childView.rerender();
|
23346
23986
|
}
|
23347
|
-
}).property('content'),
|
23348
23987
|
|
23349
|
-
|
23350
|
-
|
23351
|
-
|
23352
|
-
});
|
23988
|
+
Ember.addObserver(this, modelPath, observer);
|
23989
|
+
childView.one('willDestroyElement', this, function() {
|
23990
|
+
Ember.removeObserver(this, modelPath, observer);
|
23991
|
+
});
|
23353
23992
|
|
23354
|
-
|
23355
|
-
|
23356
|
-
|
23357
|
-
dependency, satisfied = true;
|
23993
|
+
Ember.Handlebars.helpers.view.call(this, childView, options);
|
23994
|
+
});
|
23995
|
+
}
|
23358
23996
|
|
23359
|
-
|
23360
|
-
dependency = needs[i];
|
23361
|
-
if (dependency.indexOf(':') === -1) {
|
23362
|
-
dependency = "controller:" + dependency;
|
23363
|
-
}
|
23997
|
+
})();
|
23364
23998
|
|
23365
|
-
if (!container.has(dependency)) {
|
23366
|
-
satisfied = false;
|
23367
23999
|
|
23368
|
-
}
|
23369
|
-
}
|
23370
24000
|
|
23371
|
-
|
23372
|
-
|
24001
|
+
(function() {
|
24002
|
+
|
24003
|
+
})();
|
24004
|
+
|
24005
|
+
|
24006
|
+
|
24007
|
+
(function() {
|
24008
|
+
/**
|
24009
|
+
@module ember
|
24010
|
+
@submodule ember-routing
|
24011
|
+
*/
|
24012
|
+
|
24013
|
+
var get = Ember.get, set = Ember.set;
|
24014
|
+
|
24015
|
+
Ember.ControllerMixin.reopen({
|
24016
|
+
transitionToRoute: function() {
|
24017
|
+
// target may be either another controller or a router
|
24018
|
+
var target = get(this, 'target'),
|
24019
|
+
method = target.transitionToRoute || target.transitionTo;
|
24020
|
+
return method.apply(target, arguments);
|
24021
|
+
},
|
24022
|
+
|
24023
|
+
transitionTo: function() {
|
24024
|
+
|
24025
|
+
return this.transitionToRoute.apply(this, arguments);
|
24026
|
+
},
|
24027
|
+
|
24028
|
+
replaceRoute: function() {
|
24029
|
+
// target may be either another controller or a router
|
24030
|
+
var target = get(this, 'target'),
|
24031
|
+
method = target.replaceRoute || target.replaceWith;
|
24032
|
+
return method.apply(target, arguments);
|
24033
|
+
},
|
24034
|
+
|
24035
|
+
replaceWith: function() {
|
24036
|
+
|
24037
|
+
return this.replaceRoute.apply(this, arguments);
|
24038
|
+
}
|
24039
|
+
});
|
23373
24040
|
|
23374
24041
|
})();
|
23375
24042
|
|
@@ -23506,7 +24173,12 @@ Ember.NoneLocation = Ember.Object.extend({
|
|
23506
24173
|
},
|
23507
24174
|
|
23508
24175
|
onUpdateURL: function(callback) {
|
23509
|
-
|
24176
|
+
this.updateCallback = callback;
|
24177
|
+
},
|
24178
|
+
|
24179
|
+
handleURL: function(url) {
|
24180
|
+
set(this, 'path', url);
|
24181
|
+
this.updateCallback(url);
|
23510
24182
|
},
|
23511
24183
|
|
23512
24184
|
formatURL: function(url) {
|
@@ -23587,12 +24259,14 @@ Ember.HashLocation = Ember.Object.extend({
|
|
23587
24259
|
var guid = Ember.guidFor(this);
|
23588
24260
|
|
23589
24261
|
Ember.$(window).bind('hashchange.ember-location-'+guid, function() {
|
23590
|
-
|
23591
|
-
|
24262
|
+
Ember.run(function() {
|
24263
|
+
var path = location.hash.substr(1);
|
24264
|
+
if (get(self, 'lastSetURL') === path) { return; }
|
23592
24265
|
|
23593
|
-
|
24266
|
+
set(self, 'lastSetURL', null);
|
23594
24267
|
|
23595
|
-
|
24268
|
+
callback(location.hash.substr(1));
|
24269
|
+
});
|
23596
24270
|
});
|
23597
24271
|
},
|
23598
24272
|
|
@@ -23657,7 +24331,7 @@ Ember.HistoryLocation = Ember.Object.extend({
|
|
23657
24331
|
@method initState
|
23658
24332
|
*/
|
23659
24333
|
initState: function() {
|
23660
|
-
this.replaceState(
|
24334
|
+
this.replaceState(this.formatURL(this.getURL()));
|
23661
24335
|
set(this, 'history', window.history);
|
23662
24336
|
},
|
23663
24337
|
|
@@ -23672,12 +24346,18 @@ Ember.HistoryLocation = Ember.Object.extend({
|
|
23672
24346
|
/**
|
23673
24347
|
@private
|
23674
24348
|
|
23675
|
-
Returns the current `location.pathname
|
24349
|
+
Returns the current `location.pathname` without rootURL
|
23676
24350
|
|
23677
24351
|
@method getURL
|
23678
24352
|
*/
|
23679
24353
|
getURL: function() {
|
23680
|
-
|
24354
|
+
var rootURL = get(this, 'rootURL'),
|
24355
|
+
url = get(this, 'location').pathname;
|
24356
|
+
|
24357
|
+
rootURL = rootURL.replace(/\/$/, '');
|
24358
|
+
url = url.replace(rootURL, '');
|
24359
|
+
|
24360
|
+
return url;
|
23681
24361
|
},
|
23682
24362
|
|
23683
24363
|
/**
|
@@ -23760,13 +24440,14 @@ Ember.HistoryLocation = Ember.Object.extend({
|
|
23760
24440
|
@param callback {Function}
|
23761
24441
|
*/
|
23762
24442
|
onUpdateURL: function(callback) {
|
23763
|
-
var guid = Ember.guidFor(this)
|
24443
|
+
var guid = Ember.guidFor(this),
|
24444
|
+
self = this;
|
23764
24445
|
|
23765
24446
|
Ember.$(window).bind('popstate.ember-location-'+guid, function(e) {
|
23766
24447
|
if(!popstateReady) {
|
23767
24448
|
return;
|
23768
24449
|
}
|
23769
|
-
callback(
|
24450
|
+
callback(self.getURL());
|
23770
24451
|
});
|
23771
24452
|
},
|
23772
24453
|
|
@@ -24028,68 +24709,32 @@ var get = Ember.get, set = Ember.set,
|
|
24028
24709
|
layer, and a list of the event listeners that are setup by default, visit the
|
24029
24710
|
[Ember View Layer guide](http://emberjs.com/guides/view_layer#toc_event-delegation).
|
24030
24711
|
|
24031
|
-
###
|
24712
|
+
### Initializers
|
24032
24713
|
|
24033
|
-
|
24034
|
-
*classes*, not *instances*. When your application loads, all of the instances
|
24035
|
-
are created for you. Creating these instances is the responsibility of
|
24036
|
-
`Ember.Application`.
|
24037
|
-
|
24038
|
-
When the `Ember.Application` initializes, it will look for an `Ember.Router`
|
24039
|
-
class defined on the applications's `Router` property, like this:
|
24714
|
+
Libraries on top of Ember can register additional initializers, like so:
|
24040
24715
|
|
24041
24716
|
```javascript
|
24042
|
-
|
24043
|
-
|
24044
|
-
});
|
24045
|
-
```
|
24046
|
-
|
24047
|
-
If found, the router is instantiated and saved on the application's `router`
|
24048
|
-
property (note the lowercase 'r'). While you should *not* reference this
|
24049
|
-
router instance directly from your application code, having access to
|
24050
|
-
`App.router` from the console can be useful during debugging.
|
24051
|
-
|
24052
|
-
After the router is created, the application loops through all of the
|
24053
|
-
registered _injections_ and invokes them once for each property on the
|
24054
|
-
`Ember.Application` object.
|
24055
|
-
|
24056
|
-
An injection is a function that is responsible for instantiating objects from
|
24057
|
-
classes defined on the application. By default, the only injection registered
|
24058
|
-
instantiates controllers and makes them available on the router.
|
24717
|
+
Ember.Application.initializer({
|
24718
|
+
name: "store",
|
24059
24719
|
|
24060
|
-
|
24061
|
-
|
24062
|
-
|
24063
|
-
App.MyController = Ember.Controller.extend({
|
24064
|
-
// ...
|
24720
|
+
initialize: function(container, application) {
|
24721
|
+
container.register('store', 'main', application.Store);
|
24722
|
+
}
|
24065
24723
|
});
|
24066
24724
|
```
|
24067
24725
|
|
24068
|
-
|
24069
|
-
`myController` property.
|
24726
|
+
### Routing
|
24070
24727
|
|
24071
|
-
|
24072
|
-
|
24073
|
-
|
24728
|
+
In addition to creating your application's router, `Ember.Application` is
|
24729
|
+
also responsible for telling the router when to start routing. Transitions
|
24730
|
+
between routes can be logged with the LOG_TRANSITIONS flag:
|
24074
24731
|
|
24075
24732
|
```javascript
|
24076
|
-
Ember.Application.
|
24077
|
-
|
24078
|
-
before: 'controllers',
|
24079
|
-
|
24080
|
-
injection: function(app, router, property) {
|
24081
|
-
if (property === 'Store') {
|
24082
|
-
set(router, 'store', app[property].create());
|
24083
|
-
}
|
24084
|
-
}
|
24733
|
+
window.App = Ember.Application.create({
|
24734
|
+
LOG_TRANSITIONS: true
|
24085
24735
|
});
|
24086
24736
|
```
|
24087
24737
|
|
24088
|
-
### Routing
|
24089
|
-
|
24090
|
-
In addition to creating your application's router, `Ember.Application` is
|
24091
|
-
also responsible for telling the router when to start routing.
|
24092
|
-
|
24093
24738
|
By default, the router will begin trying to translate the current URL into
|
24094
24739
|
application state once the browser emits the `DOMContentReady` event. If you
|
24095
24740
|
need to defer routing, you can call the application's `deferReadiness()`
|
@@ -24097,14 +24742,7 @@ var get = Ember.get, set = Ember.set,
|
|
24097
24742
|
|
24098
24743
|
If there is any setup required before routing begins, you can implement a
|
24099
24744
|
`ready()` method on your app that will be invoked immediately before routing
|
24100
|
-
begins
|
24101
|
-
|
24102
|
-
```javascript
|
24103
|
-
window.App = Ember.Application.create({
|
24104
|
-
ready: function() {
|
24105
|
-
this.set('router.enableLogging', true);
|
24106
|
-
}
|
24107
|
-
});
|
24745
|
+
begins.
|
24108
24746
|
|
24109
24747
|
To begin routing, you must have at a minimum a top-level controller and view.
|
24110
24748
|
You define these as `App.ApplicationController` and `App.ApplicationView`,
|
@@ -24122,8 +24760,7 @@ var get = Ember.get, set = Ember.set,
|
|
24122
24760
|
@namespace Ember
|
24123
24761
|
@extends Ember.Namespace
|
24124
24762
|
*/
|
24125
|
-
var Application = Ember.Application = Ember.Namespace.extend(
|
24126
|
-
/** @scope Ember.Application.prototype */{
|
24763
|
+
var Application = Ember.Application = Ember.Namespace.extend({
|
24127
24764
|
|
24128
24765
|
/**
|
24129
24766
|
The root DOM element of the Application. This can be specified as an
|
@@ -24202,6 +24839,11 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24202
24839
|
|
24203
24840
|
this.deferUntilDOMReady();
|
24204
24841
|
this.scheduleInitialize();
|
24842
|
+
|
24843
|
+
|
24844
|
+
|
24845
|
+
|
24846
|
+
|
24205
24847
|
},
|
24206
24848
|
|
24207
24849
|
/**
|
@@ -24333,9 +24975,52 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24333
24975
|
}
|
24334
24976
|
},
|
24335
24977
|
|
24978
|
+
/**
|
24979
|
+
registers a factory for later injection
|
24980
|
+
|
24981
|
+
Example:
|
24982
|
+
|
24983
|
+
```javascript
|
24984
|
+
App = Ember.Application.create();
|
24985
|
+
|
24986
|
+
App.Person = Ember.Object.extend({});
|
24987
|
+
App.Orange = Ember.Object.extend({});
|
24988
|
+
App.Email = Ember.Object.extend({});
|
24989
|
+
|
24990
|
+
App.register('model:user', App.Person, {singleton: false });
|
24991
|
+
App.register('fruit:favorite', App.Orange);
|
24992
|
+
App.register('communication:main', App.Email, {singleton: false});
|
24993
|
+
```
|
24994
|
+
|
24995
|
+
@method register
|
24996
|
+
@param type {String}
|
24997
|
+
@param name {String}
|
24998
|
+
@param factory {String}
|
24999
|
+
@param options {String} (optional)
|
25000
|
+
**/
|
24336
25001
|
register: function() {
|
24337
25002
|
var container = this.__container__;
|
24338
|
-
|
25003
|
+
container.register.apply(container, arguments);
|
25004
|
+
},
|
25005
|
+
/**
|
25006
|
+
defines an injection or typeInjection
|
25007
|
+
|
25008
|
+
Example:
|
25009
|
+
|
25010
|
+
```javascript
|
25011
|
+
App.inject(<full_name or type>, <property name>, <full_name>)
|
25012
|
+
App.inject('model:user', 'email', 'model:email')
|
25013
|
+
App.inject('model', 'source', 'source:main')
|
25014
|
+
```
|
25015
|
+
|
25016
|
+
@method inject
|
25017
|
+
@param factoryNameOrType {String}
|
25018
|
+
@param property {String}
|
25019
|
+
@param injectionName {String}
|
25020
|
+
**/
|
25021
|
+
inject: function(){
|
25022
|
+
var container = this.__container__;
|
25023
|
+
container.injection.apply(container, arguments);
|
24339
25024
|
},
|
24340
25025
|
|
24341
25026
|
/**
|
@@ -24343,7 +25028,7 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24343
25028
|
|
24344
25029
|
Initialize the application. This happens automatically.
|
24345
25030
|
|
24346
|
-
Run any
|
25031
|
+
Run any initializers and run the application load hook. These hooks may
|
24347
25032
|
choose to defer readiness. For example, an authentication hook might want
|
24348
25033
|
to defer readiness until the auth token has been retrieved.
|
24349
25034
|
|
@@ -24357,13 +25042,10 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24357
25042
|
// At this point, the App.Router must already be assigned
|
24358
25043
|
this.__container__.register('router', 'main', this.Router);
|
24359
25044
|
|
24360
|
-
// Run any injections and run the application load hook. These hooks may
|
24361
|
-
// choose to defer readiness. For example, an authentication hook might want
|
24362
|
-
// to defer readiness until the auth token has been retrieved.
|
24363
25045
|
this.runInitializers();
|
24364
25046
|
Ember.runLoadHooks('application', this);
|
24365
25047
|
|
24366
|
-
// At this point, any
|
25048
|
+
// At this point, any initializers or load hooks that would have wanted
|
24367
25049
|
// to defer readiness have fired. In general, advancing readiness here
|
24368
25050
|
// will proceed to didBecomeReady.
|
24369
25051
|
this.advanceReadiness();
|
@@ -24371,6 +25053,15 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24371
25053
|
return this;
|
24372
25054
|
},
|
24373
25055
|
|
25056
|
+
reset: function() {
|
25057
|
+
get(this, '__container__').destroy();
|
25058
|
+
this.buildContainer();
|
25059
|
+
|
25060
|
+
this.isInitialized = false;
|
25061
|
+
this.initialize();
|
25062
|
+
this.startRouting();
|
25063
|
+
},
|
25064
|
+
|
24374
25065
|
/**
|
24375
25066
|
@private
|
24376
25067
|
@method runInitializers
|
@@ -24458,6 +25149,12 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24458
25149
|
router.startRouting();
|
24459
25150
|
},
|
24460
25151
|
|
25152
|
+
handleURL: function(url) {
|
25153
|
+
var router = this.__container__.lookup('router:main');
|
25154
|
+
|
25155
|
+
router.handleURL(url);
|
25156
|
+
},
|
25157
|
+
|
24461
25158
|
/**
|
24462
25159
|
Called when the Application has become ready.
|
24463
25160
|
The call will be delayed until the DOM has become ready.
|
@@ -24472,7 +25169,7 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24472
25169
|
var eventDispatcher = get(this, 'eventDispatcher');
|
24473
25170
|
if (eventDispatcher) { eventDispatcher.destroy(); }
|
24474
25171
|
|
24475
|
-
this
|
25172
|
+
get(this, '__container__').destroy();
|
24476
25173
|
},
|
24477
25174
|
|
24478
25175
|
initializer: function(options) {
|
@@ -24520,7 +25217,7 @@ Ember.Application.reopenClass({
|
|
24520
25217
|
*/
|
24521
25218
|
buildContainer: function(namespace) {
|
24522
25219
|
var container = new Ember.Container();
|
24523
|
-
Ember.Container.defaultContainer = container;
|
25220
|
+
Ember.Container.defaultContainer = Ember.Container.defaultContainer || container;
|
24524
25221
|
|
24525
25222
|
container.set = Ember.set;
|
24526
25223
|
container.resolver = resolverFor(namespace);
|
@@ -24595,6 +25292,85 @@ Ember.runLoadHooks('Ember.Application', Ember.Application);
|
|
24595
25292
|
|
24596
25293
|
|
24597
25294
|
|
25295
|
+
(function() {
|
25296
|
+
/**
|
25297
|
+
@module ember
|
25298
|
+
@submodule ember-routing
|
25299
|
+
*/
|
25300
|
+
|
25301
|
+
var get = Ember.get, set = Ember.set;
|
25302
|
+
var ControllersProxy = Ember.Object.extend({
|
25303
|
+
controller: null,
|
25304
|
+
|
25305
|
+
unknownProperty: function(controllerName) {
|
25306
|
+
var controller = get(this, 'controller'),
|
25307
|
+
needs = get(controller, 'needs'),
|
25308
|
+
container = controller.get('container'),
|
25309
|
+
dependency;
|
25310
|
+
|
25311
|
+
for (var i=0, l=needs.length; i<l; i++) {
|
25312
|
+
dependency = needs[i];
|
25313
|
+
if (dependency === controllerName) {
|
25314
|
+
return container.lookup('controller:' + controllerName);
|
25315
|
+
}
|
25316
|
+
}
|
25317
|
+
}
|
25318
|
+
});
|
25319
|
+
|
25320
|
+
function verifyDependencies(controller) {
|
25321
|
+
var needs = get(controller, 'needs'),
|
25322
|
+
container = get(controller, 'container'),
|
25323
|
+
dependency, satisfied = true;
|
25324
|
+
|
25325
|
+
for (var i=0, l=needs.length; i<l; i++) {
|
25326
|
+
dependency = needs[i];
|
25327
|
+
if (dependency.indexOf(':') === -1) {
|
25328
|
+
dependency = "controller:" + dependency;
|
25329
|
+
}
|
25330
|
+
|
25331
|
+
if (!container.has(dependency)) {
|
25332
|
+
satisfied = false;
|
25333
|
+
|
25334
|
+
}
|
25335
|
+
}
|
25336
|
+
|
25337
|
+
return satisfied;
|
25338
|
+
}
|
25339
|
+
|
25340
|
+
Ember.ControllerMixin.reopen({
|
25341
|
+
concatenatedProperties: ['needs'],
|
25342
|
+
needs: [],
|
25343
|
+
|
25344
|
+
init: function() {
|
25345
|
+
this._super.apply(this, arguments);
|
25346
|
+
|
25347
|
+
// Structure asserts to still do verification but not string concat in production
|
25348
|
+
if(!verifyDependencies(this)) {
|
25349
|
+
|
25350
|
+
}
|
25351
|
+
},
|
25352
|
+
|
25353
|
+
controllerFor: function(controllerName) {
|
25354
|
+
|
25355
|
+
var container = get(this, 'container');
|
25356
|
+
return container.lookup('controller:' + controllerName);
|
25357
|
+
},
|
25358
|
+
|
25359
|
+
controllers: Ember.computed(function() {
|
25360
|
+
return ControllersProxy.create({ controller: this });
|
25361
|
+
})
|
25362
|
+
});
|
25363
|
+
|
25364
|
+
})();
|
25365
|
+
|
25366
|
+
|
25367
|
+
|
25368
|
+
(function() {
|
25369
|
+
|
25370
|
+
})();
|
25371
|
+
|
25372
|
+
|
25373
|
+
|
24598
25374
|
(function() {
|
24599
25375
|
/**
|
24600
25376
|
Ember Application
|
@@ -25563,9 +26339,7 @@ Ember.StateManager = Ember.State.extend({
|
|
25563
26339
|
@property currentPath
|
25564
26340
|
@type String
|
25565
26341
|
*/
|
25566
|
-
currentPath: Ember.computed('currentState',
|
25567
|
-
return get(this, 'currentState.path');
|
25568
|
-
}),
|
26342
|
+
currentPath: Ember.computed.alias('currentState.path'),
|
25569
26343
|
|
25570
26344
|
/**
|
25571
26345
|
The name of transitionEvent that this stateManager will dispatch
|