ember-rails 0.9.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
data/README.md
CHANGED
@@ -84,6 +84,8 @@ Default behavior for ember-rails is to precompile handlebars templates only in p
|
|
84
84
|
If you don't want this behavior you can turn it off in your application configuration block :
|
85
85
|
|
86
86
|
config.handlebars.precompile = false
|
87
|
+
|
88
|
+
(Remember to clear the local sprockets cache if you change the value of precompile, by default at `tmp/cache/assets`)
|
87
89
|
|
88
90
|
Bundle all templates together thanks to Sprockets,
|
89
91
|
e.g create `app/assets/javascripts/templates/all.js` with:
|
@@ -77,11 +77,11 @@ module Ember
|
|
77
77
|
|
78
78
|
if root.kind_of? Array
|
79
79
|
root.each do |root|
|
80
|
-
path.
|
80
|
+
path.sub!(/#{Regexp.quote(root)}\//, '')
|
81
81
|
end
|
82
82
|
else
|
83
83
|
unless root.empty?
|
84
|
-
path.
|
84
|
+
path.sub!(/#{Regexp.quote(root)}\/?/, '')
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
data/lib/ember/rails/version.rb
CHANGED
data/lib/ember/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
// Version: v1.0.0-pre.
|
2
|
-
// Last commit:
|
1
|
+
// Version: v1.0.0-pre.4-206-g4f2036f
|
2
|
+
// Last commit: 4f2036f (2013-02-12 17:02:00 +0100)
|
3
3
|
|
4
4
|
|
5
5
|
(function() {
|
@@ -69,6 +69,21 @@ Ember.warn = function(message, test) {
|
|
69
69
|
}
|
70
70
|
};
|
71
71
|
|
72
|
+
/**
|
73
|
+
Display a debug notice. Ember build tools will remove any calls to
|
74
|
+
`Ember.debug()` when doing a production build.
|
75
|
+
|
76
|
+
```javascript
|
77
|
+
Ember.debug("I'm a debug notice!");
|
78
|
+
```
|
79
|
+
|
80
|
+
@method debug
|
81
|
+
@param {String} message A debug message to display.
|
82
|
+
*/
|
83
|
+
Ember.debug = function(message) {
|
84
|
+
Ember.Logger.debug("DEBUG: "+message);
|
85
|
+
};
|
86
|
+
|
72
87
|
/**
|
73
88
|
Display a deprecation warning with the provided message and a stack trace
|
74
89
|
(Chrome and Firefox only). Ember build tools will remove any calls to
|
@@ -133,17 +148,10 @@ Ember.deprecateFunc = function(message, func) {
|
|
133
148
|
};
|
134
149
|
};
|
135
150
|
|
136
|
-
if ('undefined' !== typeof window) {
|
137
|
-
window.ember_assert = Ember.deprecateFunc("ember_assert is deprecated. Please use Ember.assert instead.", Ember.assert);
|
138
|
-
window.ember_warn = Ember.deprecateFunc("ember_warn is deprecated. Please use Ember.warn instead.", Ember.warn);
|
139
|
-
window.ember_deprecate = Ember.deprecateFunc("ember_deprecate is deprecated. Please use Ember.deprecate instead.", Ember.deprecate);
|
140
|
-
window.ember_deprecateFunc = Ember.deprecateFunc("ember_deprecateFunc is deprecated. Please use Ember.deprecateFunc instead.", Ember.deprecateFunc);
|
141
|
-
}
|
142
|
-
|
143
151
|
})();
|
144
152
|
|
145
|
-
// Version: v1.0.0-
|
146
|
-
// Last commit:
|
153
|
+
// Version: v1.0.0-rc.1
|
154
|
+
// Last commit: 8b061b4 (2013-02-15 12:10:22 -0800)
|
147
155
|
|
148
156
|
|
149
157
|
(function() {
|
@@ -203,7 +211,7 @@ var define, requireModule;
|
|
203
211
|
|
204
212
|
@class Ember
|
205
213
|
@static
|
206
|
-
@version 1.0.0-
|
214
|
+
@version 1.0.0-rc.1
|
207
215
|
*/
|
208
216
|
|
209
217
|
if ('undefined' === typeof Ember) {
|
@@ -230,10 +238,10 @@ Ember.toString = function() { return "Ember"; };
|
|
230
238
|
/**
|
231
239
|
@property VERSION
|
232
240
|
@type String
|
233
|
-
@default '1.0.0-
|
241
|
+
@default '1.0.0-rc.1'
|
234
242
|
@final
|
235
243
|
*/
|
236
|
-
Ember.VERSION = '1.0.0-
|
244
|
+
Ember.VERSION = '1.0.0-rc.1';
|
237
245
|
|
238
246
|
/**
|
239
247
|
Standard environmental variables. You can define these in a global `ENV`
|
@@ -303,20 +311,12 @@ Ember.K = function() { return this; };
|
|
303
311
|
|
304
312
|
if ('undefined' === typeof Ember.assert) { Ember.assert = Ember.K; }
|
305
313
|
if ('undefined' === typeof Ember.warn) { Ember.warn = Ember.K; }
|
314
|
+
if ('undefined' === typeof Ember.debug) { Ember.debug = Ember.K; }
|
306
315
|
if ('undefined' === typeof Ember.deprecate) { Ember.deprecate = Ember.K; }
|
307
316
|
if ('undefined' === typeof Ember.deprecateFunc) {
|
308
317
|
Ember.deprecateFunc = function(_, func) { return func; };
|
309
318
|
}
|
310
319
|
|
311
|
-
// These are deprecated but still supported
|
312
|
-
|
313
|
-
if ('undefined' === typeof ember_assert) { exports.ember_assert = Ember.K; }
|
314
|
-
if ('undefined' === typeof ember_warn) { exports.ember_warn = Ember.K; }
|
315
|
-
if ('undefined' === typeof ember_deprecate) { exports.ember_deprecate = Ember.K; }
|
316
|
-
if ('undefined' === typeof ember_deprecateFunc) {
|
317
|
-
exports.ember_deprecateFunc = function(_, func) { return func; };
|
318
|
-
}
|
319
|
-
|
320
320
|
/**
|
321
321
|
Previously we used `Ember.$.uuid`, however `$.uuid` has been removed from
|
322
322
|
jQuery master. We'll just bootstrap our own uuid now.
|
@@ -331,14 +331,36 @@ Ember.uuid = 0;
|
|
331
331
|
// LOGGER
|
332
332
|
//
|
333
333
|
|
334
|
+
function consoleMethod(name) {
|
335
|
+
if (imports.console && imports.console[name]) {
|
336
|
+
// Older IE doesn't support apply, but Chrome needs it
|
337
|
+
if (imports.console[name].apply) {
|
338
|
+
return function() {
|
339
|
+
imports.console[name].apply(imports.console, arguments);
|
340
|
+
};
|
341
|
+
} else {
|
342
|
+
return function() {
|
343
|
+
var message = Array.prototype.join.call(arguments, ', ');
|
344
|
+
imports.console[name](message);
|
345
|
+
};
|
346
|
+
}
|
347
|
+
}
|
348
|
+
}
|
349
|
+
|
334
350
|
/**
|
335
|
-
Inside Ember-Metal, simply uses the `imports.console
|
351
|
+
Inside Ember-Metal, simply uses the methods from `imports.console`.
|
336
352
|
Override this to provide more robust logging functionality.
|
337
353
|
|
338
354
|
@class Logger
|
339
355
|
@namespace Ember
|
340
356
|
*/
|
341
|
-
Ember.Logger =
|
357
|
+
Ember.Logger = {
|
358
|
+
log: consoleMethod('log') || Ember.K,
|
359
|
+
warn: consoleMethod('warn') || Ember.K,
|
360
|
+
error: consoleMethod('error') || Ember.K,
|
361
|
+
info: consoleMethod('info') || Ember.K,
|
362
|
+
debug: consoleMethod('debug') || consoleMethod('info') || Ember.K
|
363
|
+
};
|
342
364
|
|
343
365
|
|
344
366
|
// ..........................................................
|
@@ -1257,8 +1279,63 @@ Ember.subscribe = Ember.Instrumentation.subscribe;
|
|
1257
1279
|
|
1258
1280
|
|
1259
1281
|
(function() {
|
1260
|
-
|
1282
|
+
var utils = Ember.EnumerableUtils = {
|
1283
|
+
map: function(obj, callback, thisArg) {
|
1284
|
+
return obj.map ? obj.map.call(obj, callback, thisArg) : Array.prototype.map.call(obj, callback, thisArg);
|
1285
|
+
},
|
1286
|
+
|
1287
|
+
forEach: function(obj, callback, thisArg) {
|
1288
|
+
return obj.forEach ? obj.forEach.call(obj, callback, thisArg) : Array.prototype.forEach.call(obj, callback, thisArg);
|
1289
|
+
},
|
1290
|
+
|
1291
|
+
indexOf: function(obj, element, index) {
|
1292
|
+
return obj.indexOf ? obj.indexOf.call(obj, element, index) : Array.prototype.indexOf.call(obj, element, index);
|
1293
|
+
},
|
1294
|
+
|
1295
|
+
indexesOf: function(obj, elements) {
|
1296
|
+
return elements === undefined ? [] : utils.map(elements, function(item) {
|
1297
|
+
return utils.indexOf(obj, item);
|
1298
|
+
});
|
1299
|
+
},
|
1300
|
+
|
1301
|
+
addObject: function(array, item) {
|
1302
|
+
var index = utils.indexOf(array, item);
|
1303
|
+
if (index === -1) { array.push(item); }
|
1304
|
+
},
|
1305
|
+
|
1306
|
+
removeObject: function(array, item) {
|
1307
|
+
var index = utils.indexOf(array, item);
|
1308
|
+
if (index !== -1) { array.splice(index, 1); }
|
1309
|
+
},
|
1310
|
+
|
1311
|
+
replace: function(array, idx, amt, objects) {
|
1312
|
+
if (array.replace) {
|
1313
|
+
return array.replace(idx, amt, objects);
|
1314
|
+
} else {
|
1315
|
+
var args = Array.prototype.concat.apply([idx, amt], objects);
|
1316
|
+
return array.splice.apply(array, args);
|
1317
|
+
}
|
1318
|
+
},
|
1319
|
+
|
1320
|
+
intersection: function(array1, array2) {
|
1321
|
+
var intersection = [];
|
1322
|
+
|
1323
|
+
array1.forEach(function(element) {
|
1324
|
+
if (array2.indexOf(element) >= 0) {
|
1325
|
+
intersection.push(element);
|
1326
|
+
}
|
1327
|
+
});
|
1328
|
+
|
1329
|
+
return intersection;
|
1330
|
+
}
|
1331
|
+
};
|
1332
|
+
|
1333
|
+
})();
|
1334
|
+
|
1261
1335
|
|
1336
|
+
|
1337
|
+
(function() {
|
1338
|
+
/*jshint newcap:false*/
|
1262
1339
|
/**
|
1263
1340
|
@module ember-metal
|
1264
1341
|
*/
|
@@ -1336,46 +1413,6 @@ Ember.ArrayPolyfills = {
|
|
1336
1413
|
indexOf: arrayIndexOf
|
1337
1414
|
};
|
1338
1415
|
|
1339
|
-
var utils = Ember.EnumerableUtils = {
|
1340
|
-
map: function(obj, callback, thisArg) {
|
1341
|
-
return obj.map ? obj.map.call(obj, callback, thisArg) : arrayMap.call(obj, callback, thisArg);
|
1342
|
-
},
|
1343
|
-
|
1344
|
-
forEach: function(obj, callback, thisArg) {
|
1345
|
-
return obj.forEach ? obj.forEach.call(obj, callback, thisArg) : arrayForEach.call(obj, callback, thisArg);
|
1346
|
-
},
|
1347
|
-
|
1348
|
-
indexOf: function(obj, element, index) {
|
1349
|
-
return obj.indexOf ? obj.indexOf.call(obj, element, index) : arrayIndexOf.call(obj, element, index);
|
1350
|
-
},
|
1351
|
-
|
1352
|
-
indexesOf: function(obj, elements) {
|
1353
|
-
return elements === undefined ? [] : utils.map(elements, function(item) {
|
1354
|
-
return utils.indexOf(obj, item);
|
1355
|
-
});
|
1356
|
-
},
|
1357
|
-
|
1358
|
-
addObject: function(array, item) {
|
1359
|
-
var index = utils.indexOf(array, item);
|
1360
|
-
if (index === -1) { array.push(item); }
|
1361
|
-
},
|
1362
|
-
|
1363
|
-
removeObject: function(array, item) {
|
1364
|
-
var index = utils.indexOf(array, item);
|
1365
|
-
if (index !== -1) { array.splice(index, 1); }
|
1366
|
-
},
|
1367
|
-
|
1368
|
-
replace: function(array, idx, amt, objects) {
|
1369
|
-
if (array.replace) {
|
1370
|
-
return array.replace(idx, amt, objects);
|
1371
|
-
} else {
|
1372
|
-
var args = Array.prototype.concat.apply([idx, amt], objects);
|
1373
|
-
return array.splice.apply(array, args);
|
1374
|
-
}
|
1375
|
-
}
|
1376
|
-
};
|
1377
|
-
|
1378
|
-
|
1379
1416
|
if (Ember.SHIM_ES5) {
|
1380
1417
|
if (!Array.prototype.map) {
|
1381
1418
|
Array.prototype.map = arrayMap;
|
@@ -2112,6 +2149,17 @@ var Descriptor = Ember.Descriptor = function() {};
|
|
2112
2149
|
// DEFINING PROPERTIES API
|
2113
2150
|
//
|
2114
2151
|
|
2152
|
+
var MANDATORY_SETTER_FUNCTION = Ember.MANDATORY_SETTER_FUNCTION = function(value) {
|
2153
|
+
Ember.assert("You must use Ember.set() to access this property (of " + this + ")", false);
|
2154
|
+
};
|
2155
|
+
|
2156
|
+
var DEFAULT_GETTER_FUNCTION = Ember.DEFAULT_GETTER_FUNCTION = function(name) {
|
2157
|
+
return function() {
|
2158
|
+
var meta = this[META_KEY];
|
2159
|
+
return meta && meta.values[name];
|
2160
|
+
};
|
2161
|
+
};
|
2162
|
+
|
2115
2163
|
/**
|
2116
2164
|
@private
|
2117
2165
|
|
@@ -2195,13 +2243,8 @@ Ember.defineProperty = function(obj, keyName, desc, data, meta) {
|
|
2195
2243
|
objectDefineProperty(obj, keyName, {
|
2196
2244
|
configurable: true,
|
2197
2245
|
enumerable: true,
|
2198
|
-
set:
|
2199
|
-
|
2200
|
-
},
|
2201
|
-
get: function() {
|
2202
|
-
var meta = this[META_KEY];
|
2203
|
-
return meta && meta.values[keyName];
|
2204
|
-
}
|
2246
|
+
set: MANDATORY_SETTER_FUNCTION,
|
2247
|
+
get: DEFAULT_GETTER_FUNCTION(keyName)
|
2205
2248
|
});
|
2206
2249
|
} else {
|
2207
2250
|
obj[keyName] = data;
|
@@ -2926,13 +2969,8 @@ Ember.watch = function(obj, keyName) {
|
|
2926
2969
|
o_defineProperty(obj, keyName, {
|
2927
2970
|
configurable: true,
|
2928
2971
|
enumerable: true,
|
2929
|
-
set:
|
2930
|
-
|
2931
|
-
},
|
2932
|
-
get: function() {
|
2933
|
-
var meta = this[META_KEY];
|
2934
|
-
return meta && meta.values[keyName];
|
2935
|
-
}
|
2972
|
+
set: Ember.MANDATORY_SETTER_FUNCTION,
|
2973
|
+
get: Ember.DEFAULT_GETTER_FUNCTION(keyName)
|
2936
2974
|
});
|
2937
2975
|
}
|
2938
2976
|
} else {
|
@@ -5845,7 +5883,8 @@ define("rsvp",
|
|
5845
5883
|
callbacks, callbackTuple, callback, binding, event;
|
5846
5884
|
|
5847
5885
|
if (callbacks = allCallbacks[eventName]) {
|
5848
|
-
|
5886
|
+
// Don't cache the callbacks.length since it may grow
|
5887
|
+
for (var i=0; i<callbacks.length; i++) {
|
5849
5888
|
callbackTuple = callbacks[i];
|
5850
5889
|
callback = callbackTuple[0];
|
5851
5890
|
binding = callbackTuple[1];
|
@@ -5963,9 +6002,41 @@ define("rsvp",
|
|
5963
6002
|
});
|
5964
6003
|
}
|
5965
6004
|
|
6005
|
+
function all(promises) {
|
6006
|
+
var i, results = [];
|
6007
|
+
var allPromise = new Promise();
|
6008
|
+
var remaining = promises.length;
|
6009
|
+
|
6010
|
+
if (remaining === 0) {
|
6011
|
+
allPromise.resolve([]);
|
6012
|
+
}
|
6013
|
+
|
6014
|
+
var resolver = function(index) {
|
6015
|
+
return function(value) {
|
6016
|
+
resolve(index, value);
|
6017
|
+
};
|
6018
|
+
};
|
6019
|
+
|
6020
|
+
var resolve = function(index, value) {
|
6021
|
+
results[index] = value;
|
6022
|
+
if (--remaining === 0) {
|
6023
|
+
allPromise.resolve(results);
|
6024
|
+
}
|
6025
|
+
};
|
6026
|
+
|
6027
|
+
var reject = function(error) {
|
6028
|
+
allPromise.reject(error);
|
6029
|
+
};
|
6030
|
+
|
6031
|
+
for (i = 0; i < remaining; i++) {
|
6032
|
+
promises[i].then(resolver(i), reject);
|
6033
|
+
}
|
6034
|
+
return allPromise;
|
6035
|
+
}
|
6036
|
+
|
5966
6037
|
EventTarget.mixin(Promise.prototype);
|
5967
6038
|
|
5968
|
-
RSVP = { async: async, Promise: Promise, Event: Event, EventTarget: EventTarget };
|
6039
|
+
RSVP = { async: async, Promise: Promise, Event: Event, EventTarget: EventTarget, all: all, raiseOnUncaughtExceptions: true };
|
5969
6040
|
return RSVP;
|
5970
6041
|
});
|
5971
6042
|
|
@@ -6036,10 +6107,10 @@ define("container",
|
|
6036
6107
|
this.resolver = parent && parent.resolver || function() {};
|
6037
6108
|
this.registry = new InheritingDict(parent && parent.registry);
|
6038
6109
|
this.cache = new InheritingDict(parent && parent.cache);
|
6039
|
-
this.typeInjections =
|
6110
|
+
this.typeInjections = new InheritingDict(parent && parent.typeInjections);
|
6040
6111
|
this.injections = {};
|
6041
|
-
this.
|
6042
|
-
this.
|
6112
|
+
this._options = new InheritingDict(parent && parent._options);
|
6113
|
+
this._typeOptions = new InheritingDict(parent && parent._typeOptions);
|
6043
6114
|
}
|
6044
6115
|
|
6045
6116
|
Container.prototype = {
|
@@ -6054,8 +6125,20 @@ define("container",
|
|
6054
6125
|
},
|
6055
6126
|
|
6056
6127
|
register: function(type, name, factory, options) {
|
6057
|
-
|
6058
|
-
|
6128
|
+
var fullName;
|
6129
|
+
|
6130
|
+
|
6131
|
+
if (type.indexOf(':') !== -1){
|
6132
|
+
options = factory;
|
6133
|
+
factory = name;
|
6134
|
+
fullName = type;
|
6135
|
+
} else {
|
6136
|
+
Ember.deprecate('register("'+type +'", "'+ name+'") is now deprecated in-favour of register("'+type+':'+name+'");', true);
|
6137
|
+
fullName = type + ":" + name;
|
6138
|
+
}
|
6139
|
+
|
6140
|
+
this.registry.set(fullName, factory);
|
6141
|
+
this._options.set(fullName, options || {});
|
6059
6142
|
},
|
6060
6143
|
|
6061
6144
|
resolve: function(fullName) {
|
@@ -6089,19 +6172,31 @@ define("container",
|
|
6089
6172
|
optionsForType: function(type, options) {
|
6090
6173
|
if (this.parent) { illegalChildOperation('optionsForType'); }
|
6091
6174
|
|
6092
|
-
this.
|
6175
|
+
this._typeOptions.set(type, options);
|
6176
|
+
},
|
6177
|
+
|
6178
|
+
options: function(type, options) {
|
6179
|
+
this.optionsForType(type, options);
|
6093
6180
|
},
|
6094
6181
|
|
6095
6182
|
typeInjection: function(type, property, fullName) {
|
6096
6183
|
if (this.parent) { illegalChildOperation('typeInjection'); }
|
6097
6184
|
|
6098
|
-
var injections = this.typeInjections
|
6185
|
+
var injections = this.typeInjections.get(type);
|
6186
|
+
if (!injections) {
|
6187
|
+
injections = [];
|
6188
|
+
this.typeInjections.set(type, injections);
|
6189
|
+
}
|
6099
6190
|
injections.push({ property: property, fullName: fullName });
|
6100
6191
|
},
|
6101
6192
|
|
6102
6193
|
injection: function(factoryName, property, injectionName) {
|
6103
6194
|
if (this.parent) { illegalChildOperation('injection'); }
|
6104
6195
|
|
6196
|
+
if (factoryName.indexOf(':') === -1) {
|
6197
|
+
return this.typeInjection(factoryName, property, injectionName);
|
6198
|
+
}
|
6199
|
+
|
6105
6200
|
var injections = this.injections[factoryName] = this.injections[factoryName] || [];
|
6106
6201
|
injections.push({ property: property, fullName: injectionName });
|
6107
6202
|
},
|
@@ -6162,14 +6257,14 @@ define("container",
|
|
6162
6257
|
}
|
6163
6258
|
|
6164
6259
|
function option(container, fullName, optionName) {
|
6165
|
-
var options = container.
|
6260
|
+
var options = container._options.get(fullName);
|
6166
6261
|
|
6167
6262
|
if (options && options[optionName] !== undefined) {
|
6168
6263
|
return options[optionName];
|
6169
6264
|
}
|
6170
6265
|
|
6171
6266
|
var type = fullName.split(":")[0];
|
6172
|
-
options = container.
|
6267
|
+
options = container._typeOptions.get(type);
|
6173
6268
|
|
6174
6269
|
if (options) {
|
6175
6270
|
return options[optionName];
|
@@ -6193,11 +6288,12 @@ define("container",
|
|
6193
6288
|
|
6194
6289
|
if (factory) {
|
6195
6290
|
var injections = [];
|
6196
|
-
injections = injections.concat(container.typeInjections
|
6291
|
+
injections = injections.concat(container.typeInjections.get(type) || []);
|
6197
6292
|
injections = injections.concat(container.injections[fullName] || []);
|
6198
6293
|
|
6199
6294
|
var hash = buildInjections(container, injections);
|
6200
6295
|
hash.container = container;
|
6296
|
+
hash._debugContainerKey = fullName;
|
6201
6297
|
|
6202
6298
|
value = factory.create(hash);
|
6203
6299
|
|
@@ -6373,7 +6469,7 @@ Ember.empty = Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.i
|
|
6373
6469
|
Ember.compare('hello', 'hello'); // 0
|
6374
6470
|
Ember.compare('abc', 'dfg'); // -1
|
6375
6471
|
Ember.compare(2, 1); // 1
|
6376
|
-
```
|
6472
|
+
```
|
6377
6473
|
|
6378
6474
|
@method compare
|
6379
6475
|
@for Ember
|
@@ -7587,7 +7683,7 @@ Ember.Enumerable = Ember.Mixin.create(
|
|
7587
7683
|
@method find
|
7588
7684
|
@param {Function} callback The callback to execute
|
7589
7685
|
@param {Object} [target] The target object to use
|
7590
|
-
@return {Object} Found item or `
|
7686
|
+
@return {Object} Found item or `undefined`.
|
7591
7687
|
*/
|
7592
7688
|
find: function(callback, target) {
|
7593
7689
|
var len = get(this, 'length') ;
|
@@ -7615,7 +7711,7 @@ Ember.Enumerable = Ember.Mixin.create(
|
|
7615
7711
|
@method findProperty
|
7616
7712
|
@param {String} key the property to test
|
7617
7713
|
@param {String} [value] optional value to test against.
|
7618
|
-
@return {Object} found item or `
|
7714
|
+
@return {Object} found item or `undefined`
|
7619
7715
|
*/
|
7620
7716
|
findProperty: function(key, value) {
|
7621
7717
|
return this.find(iter.apply(this, arguments));
|
@@ -7675,7 +7771,7 @@ Ember.Enumerable = Ember.Mixin.create(
|
|
7675
7771
|
|
7676
7772
|
/**
|
7677
7773
|
Returns `true` if the passed function returns true for any item in the
|
7678
|
-
enumeration. This corresponds with the `
|
7774
|
+
enumeration. This corresponds with the `some()` method in JavaScript 1.6.
|
7679
7775
|
|
7680
7776
|
The callback method you provide should have the following signature (all
|
7681
7777
|
parameters are optional):
|
@@ -8195,7 +8291,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
|
|
8195
8291
|
arr.indexOf("a", -1); // 4
|
8196
8292
|
arr.indexOf("b", 3); // -1
|
8197
8293
|
arr.indexOf("a", 100); // -1
|
8198
|
-
```
|
8294
|
+
```
|
8199
8295
|
|
8200
8296
|
@method indexOf
|
8201
8297
|
@param {Object} object the item to search for
|
@@ -8840,7 +8936,7 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
|
|
8840
8936
|
var colors = ["red", "green", "blue"];
|
8841
8937
|
colors.insertAt(2, "yellow"); // ["red", "green", "yellow", "blue"]
|
8842
8938
|
colors.insertAt(5, "orange"); // Error: Index out of range
|
8843
|
-
```
|
8939
|
+
```
|
8844
8940
|
|
8845
8941
|
@method insertAt
|
8846
8942
|
@param {Number} idx index of insert the object at.
|
@@ -9141,9 +9237,6 @@ var get = Ember.get, set = Ember.set, defineProperty = Ember.defineProperty;
|
|
9141
9237
|
*/
|
9142
9238
|
Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
|
9143
9239
|
|
9144
|
-
// compatibility
|
9145
|
-
isObserverable: true,
|
9146
|
-
|
9147
9240
|
/**
|
9148
9241
|
Retrieves the value of a property from the object.
|
9149
9242
|
|
@@ -9730,7 +9823,7 @@ Ember.Evented = Ember.Mixin.create({
|
|
9730
9823
|
event.
|
9731
9824
|
|
9732
9825
|
```javascript
|
9733
|
-
person.on('didEat', food) {
|
9826
|
+
person.on('didEat', function(food) {
|
9734
9827
|
console.log('person ate some ' + food);
|
9735
9828
|
});
|
9736
9829
|
|
@@ -10010,9 +10103,9 @@ function makeCtor() {
|
|
10010
10103
|
}
|
10011
10104
|
|
10012
10105
|
var CoreObject = makeCtor();
|
10106
|
+
CoreObject.toString = function() { return "Ember.CoreObject"; };
|
10013
10107
|
|
10014
10108
|
CoreObject.PrototypeMixin = Mixin.create({
|
10015
|
-
|
10016
10109
|
reopen: function() {
|
10017
10110
|
applyMixin(this, arguments, true);
|
10018
10111
|
return this;
|
@@ -10113,9 +10206,10 @@ CoreObject.PrototypeMixin = Mixin.create({
|
|
10113
10206
|
@return {Ember.Object} receiver
|
10114
10207
|
*/
|
10115
10208
|
destroy: function() {
|
10116
|
-
if (this.
|
10209
|
+
if (this._didCallDestroy) { return; }
|
10117
10210
|
|
10118
10211
|
this.isDestroying = true;
|
10212
|
+
this._didCallDestroy = true;
|
10119
10213
|
|
10120
10214
|
if (this.willDestroy) { this.willDestroy(); }
|
10121
10215
|
|
@@ -10183,6 +10277,8 @@ CoreObject.PrototypeMixin = Mixin.create({
|
|
10183
10277
|
}
|
10184
10278
|
});
|
10185
10279
|
|
10280
|
+
CoreObject.PrototypeMixin.ownerConstructor = CoreObject;
|
10281
|
+
|
10186
10282
|
function makeToString(ret) {
|
10187
10283
|
return function() { return ret; };
|
10188
10284
|
}
|
@@ -10321,6 +10417,8 @@ var ClassMixin = Mixin.create({
|
|
10321
10417
|
|
10322
10418
|
});
|
10323
10419
|
|
10420
|
+
ClassMixin.ownerConstructor = CoreObject;
|
10421
|
+
|
10324
10422
|
if (Ember.config.overrideClassMixin) {
|
10325
10423
|
Ember.config.overrideClassMixin(ClassMixin);
|
10326
10424
|
}
|
@@ -10812,6 +10910,7 @@ Ember.Set = Ember.CoreObject.extend(Ember.MutableEnumerable, Ember.Copyable, Emb
|
|
10812
10910
|
@uses Ember.Observable
|
10813
10911
|
*/
|
10814
10912
|
Ember.Object = Ember.CoreObject.extend(Ember.Observable);
|
10913
|
+
Ember.Object.toString = function() { return "Ember.Object"; };
|
10815
10914
|
|
10816
10915
|
})();
|
10817
10916
|
|
@@ -10872,16 +10971,28 @@ var Namespace = Ember.Namespace = Ember.Object.extend({
|
|
10872
10971
|
|
10873
10972
|
Namespace.reopenClass({
|
10874
10973
|
NAMESPACES: [Ember],
|
10974
|
+
NAMESPACES_BY_ID: {},
|
10875
10975
|
PROCESSED: false,
|
10876
|
-
processAll: processAllNamespaces
|
10976
|
+
processAll: processAllNamespaces,
|
10977
|
+
byName: function(name) {
|
10978
|
+
if (!Ember.BOOTED) {
|
10979
|
+
processAllNamespaces();
|
10980
|
+
}
|
10981
|
+
|
10982
|
+
return NAMESPACES_BY_ID[name];
|
10983
|
+
}
|
10877
10984
|
});
|
10878
10985
|
|
10986
|
+
var NAMESPACES_BY_ID = Namespace.NAMESPACES_BY_ID;
|
10987
|
+
|
10879
10988
|
var hasOwnProp = ({}).hasOwnProperty,
|
10880
10989
|
guidFor = Ember.guidFor;
|
10881
10990
|
|
10882
10991
|
function processNamespace(paths, root, seen) {
|
10883
10992
|
var idx = paths.length;
|
10884
10993
|
|
10994
|
+
NAMESPACES_BY_ID[paths.join('.')] = root;
|
10995
|
+
|
10885
10996
|
// Loop over all of the keys in the namespace, looking for classes
|
10886
10997
|
for(var key in root) {
|
10887
10998
|
if (!hasOwnProp.call(root, key)) { continue; }
|
@@ -10981,12 +11092,15 @@ function classToString() {
|
|
10981
11092
|
}
|
10982
11093
|
|
10983
11094
|
function processAllNamespaces() {
|
10984
|
-
|
11095
|
+
var unprocessedNamespaces = !Namespace.PROCESSED,
|
11096
|
+
unprocessedMixins = Ember.anyUnprocessedMixins;
|
11097
|
+
|
11098
|
+
if (unprocessedNamespaces) {
|
10985
11099
|
findNamespaces();
|
10986
11100
|
Namespace.PROCESSED = true;
|
10987
11101
|
}
|
10988
11102
|
|
10989
|
-
if (
|
11103
|
+
if (unprocessedNamespaces || unprocessedMixins) {
|
10990
11104
|
var namespaces = Namespace.NAMESPACES, namespace;
|
10991
11105
|
for (var i=0, l=namespaces.length; i<l; i++) {
|
10992
11106
|
namespace = namespaces[i];
|
@@ -11112,9 +11226,7 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
|
|
11112
11226
|
|
11113
11227
|
@property arrangedContent
|
11114
11228
|
*/
|
11115
|
-
arrangedContent: Ember.computed('content',
|
11116
|
-
return get(this, 'content');
|
11117
|
-
}),
|
11229
|
+
arrangedContent: Ember.computed.alias('content'),
|
11118
11230
|
|
11119
11231
|
/**
|
11120
11232
|
Should actually retrieve the object at the specified index from the
|
@@ -11399,6 +11511,10 @@ Ember.ObjectProxy = Ember.Object.extend(
|
|
11399
11511
|
Ember.assert("Can't set ObjectProxy's content to itself", this.get('content') !== this);
|
11400
11512
|
}, 'content'),
|
11401
11513
|
|
11514
|
+
isTruthy: Ember.computed.bool('content'),
|
11515
|
+
|
11516
|
+
_debugContainerKey: null,
|
11517
|
+
|
11402
11518
|
willWatchProperty: function (key) {
|
11403
11519
|
var contentKey = 'content.' + key;
|
11404
11520
|
addBeforeObserver(this, contentKey, null, contentPropertyWillChange);
|
@@ -11823,7 +11939,7 @@ Ember.Deferred = Deferred;
|
|
11823
11939
|
@submodule ember-runtime
|
11824
11940
|
*/
|
11825
11941
|
|
11826
|
-
var loadHooks = {};
|
11942
|
+
var loadHooks = Ember.ENV.EMBER_LOAD_HOOKS || {};
|
11827
11943
|
var loaded = {};
|
11828
11944
|
|
11829
11945
|
/**
|
@@ -11910,6 +12026,9 @@ var get = Ember.get;
|
|
11910
12026
|
@extends Ember.Mixin
|
11911
12027
|
*/
|
11912
12028
|
Ember.ControllerMixin = Ember.Mixin.create({
|
12029
|
+
/* ducktype as a controller */
|
12030
|
+
isController: true,
|
12031
|
+
|
11913
12032
|
/**
|
11914
12033
|
The object to which events from the view should be sent.
|
11915
12034
|
|
@@ -11928,6 +12047,8 @@ Ember.ControllerMixin = Ember.Mixin.create({
|
|
11928
12047
|
|
11929
12048
|
store: null,
|
11930
12049
|
|
12050
|
+
model: Ember.computed.alias('content'),
|
12051
|
+
|
11931
12052
|
send: function(actionName) {
|
11932
12053
|
var args = [].slice.call(arguments, 1), target;
|
11933
12054
|
|
@@ -11976,7 +12097,8 @@ var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach;
|
|
11976
12097
|
|
11977
12098
|
songsController = Ember.ArrayController.create({
|
11978
12099
|
content: songs,
|
11979
|
-
sortProperties: ['trackNumber']
|
12100
|
+
sortProperties: ['trackNumber'],
|
12101
|
+
sortAscending: true
|
11980
12102
|
});
|
11981
12103
|
|
11982
12104
|
songsController.get('firstObject'); // {trackNumber: 2, title: 'Back in the U.S.S.R.'}
|
@@ -11991,7 +12113,19 @@ var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach;
|
|
11991
12113
|
@uses Ember.MutableEnumerable
|
11992
12114
|
*/
|
11993
12115
|
Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable, {
|
12116
|
+
|
12117
|
+
/**
|
12118
|
+
Specifies which properties dictate the arrangedContent's sort order.
|
12119
|
+
|
12120
|
+
@property {Array} sortProperties
|
12121
|
+
*/
|
11994
12122
|
sortProperties: null,
|
12123
|
+
|
12124
|
+
/**
|
12125
|
+
Specifies the arrangedContent's sort direction
|
12126
|
+
|
12127
|
+
@property {Boolean} sortAscending
|
12128
|
+
*/
|
11995
12129
|
sortAscending: true,
|
11996
12130
|
|
11997
12131
|
orderBy: function(item1, item2) {
|
@@ -12028,9 +12162,7 @@ Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable, {
|
|
12028
12162
|
return this._super();
|
12029
12163
|
},
|
12030
12164
|
|
12031
|
-
isSorted: Ember.computed('sortProperties',
|
12032
|
-
return !!get(this, 'sortProperties');
|
12033
|
-
}),
|
12165
|
+
isSorted: Ember.computed.bool('sortProperties'),
|
12034
12166
|
|
12035
12167
|
arrangedContent: Ember.computed('content', 'sortProperties.@each', function(key, value) {
|
12036
12168
|
var content = get(this, 'content'),
|
@@ -12305,20 +12437,22 @@ Ember.ArrayController = Ember.ArrayProxy.extend(Ember.ControllerMixin,
|
|
12305
12437
|
|
12306
12438
|
objectAtContent: function(idx) {
|
12307
12439
|
var length = get(this, 'length'),
|
12308
|
-
object = get(this,'arrangedContent').objectAt(idx)
|
12309
|
-
controllerClass = this.lookupItemController(object);
|
12440
|
+
object = get(this,'arrangedContent').objectAt(idx);
|
12310
12441
|
|
12311
|
-
if (
|
12312
|
-
|
12313
|
-
|
12314
|
-
|
12315
|
-
|
12316
|
-
// controllerClass is defined but the index is out of range, we want to
|
12317
|
-
// return the "out of range" value, whatever that might be. Rather than
|
12318
|
-
// make assumptions (e.g. guessing `null` or `undefined`) we defer this to
|
12319
|
-
// `arrangedContent`.
|
12320
|
-
return object;
|
12442
|
+
if (idx >= 0 && idx < length) {
|
12443
|
+
var controllerClass = this.lookupItemController(object);
|
12444
|
+
if (controllerClass) {
|
12445
|
+
return this.controllerAt(idx, object, controllerClass);
|
12446
|
+
}
|
12321
12447
|
}
|
12448
|
+
|
12449
|
+
// When `controllerClass` is falsy, we have not opted in to using item
|
12450
|
+
// controllers, so return the object directly.
|
12451
|
+
|
12452
|
+
// When the index is out of range, we want to return the "out of range"
|
12453
|
+
// value, whatever that might be. Rather than make assumptions
|
12454
|
+
// (e.g. guessing `null` or `undefined`) we defer this to `arrangedContent`.
|
12455
|
+
return object;
|
12322
12456
|
},
|
12323
12457
|
|
12324
12458
|
arrangedContentDidChange: function() {
|
@@ -12344,6 +12478,7 @@ Ember.ArrayController = Ember.ArrayProxy.extend(Ember.ControllerMixin,
|
|
12344
12478
|
|
12345
12479
|
init: function() {
|
12346
12480
|
this._super();
|
12481
|
+
if (!this.get('content')) { this.set('content', Ember.A()); }
|
12347
12482
|
this._resetSubContainers();
|
12348
12483
|
},
|
12349
12484
|
|
@@ -12437,7 +12572,7 @@ Ember Runtime
|
|
12437
12572
|
*/
|
12438
12573
|
|
12439
12574
|
var jQuery = Ember.imports.jQuery;
|
12440
|
-
Ember.assert("Ember Views require jQuery 1.
|
12575
|
+
Ember.assert("Ember Views require jQuery 1.8 or 1.9", jQuery && (jQuery().jquery.match(/^1\.(8|9)(\.\d+)?(pre|rc\d?)?/) || Ember.ENV.FORCE_JQUERY));
|
12441
12576
|
|
12442
12577
|
/**
|
12443
12578
|
Alias for jQuery
|
@@ -12716,6 +12851,21 @@ Ember._RenderBuffer.prototype =
|
|
12716
12851
|
*/
|
12717
12852
|
elementAttributes: null,
|
12718
12853
|
|
12854
|
+
/**
|
12855
|
+
A hash keyed on the name of the properties and whose value will be
|
12856
|
+
applied to that property. For example, if you wanted to apply a
|
12857
|
+
`checked=true` property to an element, you would set the
|
12858
|
+
elementProperties hash to `{'checked':true}`.
|
12859
|
+
|
12860
|
+
You should not maintain this hash yourself, rather, you should use
|
12861
|
+
the `prop()` method of `Ember.RenderBuffer`.
|
12862
|
+
|
12863
|
+
@property elementProperties
|
12864
|
+
@type Hash
|
12865
|
+
@default {}
|
12866
|
+
*/
|
12867
|
+
elementProperties: null,
|
12868
|
+
|
12719
12869
|
/**
|
12720
12870
|
The tagname of the element an instance of `Ember.RenderBuffer` represents.
|
12721
12871
|
|
@@ -12838,6 +12988,41 @@ Ember._RenderBuffer.prototype =
|
|
12838
12988
|
return this;
|
12839
12989
|
},
|
12840
12990
|
|
12991
|
+
/**
|
12992
|
+
Adds an property which will be rendered to the element.
|
12993
|
+
|
12994
|
+
@method prop
|
12995
|
+
@param {String} name The name of the property
|
12996
|
+
@param {String} value The value to add to the property
|
12997
|
+
@chainable
|
12998
|
+
@return {Ember.RenderBuffer|String} this or the current property value
|
12999
|
+
*/
|
13000
|
+
prop: function(name, value) {
|
13001
|
+
var properties = this.elementProperties = (this.elementProperties || {});
|
13002
|
+
|
13003
|
+
if (arguments.length === 1) {
|
13004
|
+
return properties[name];
|
13005
|
+
} else {
|
13006
|
+
properties[name] = value;
|
13007
|
+
}
|
13008
|
+
|
13009
|
+
return this;
|
13010
|
+
},
|
13011
|
+
|
13012
|
+
/**
|
13013
|
+
Remove an property from the list of properties to render.
|
13014
|
+
|
13015
|
+
@method removeProp
|
13016
|
+
@param {String} name The name of the property
|
13017
|
+
@chainable
|
13018
|
+
*/
|
13019
|
+
removeProp: function(name) {
|
13020
|
+
var properties = this.elementProperties;
|
13021
|
+
if (properties) { delete properties[name]; }
|
13022
|
+
|
13023
|
+
return this;
|
13024
|
+
},
|
13025
|
+
|
12841
13026
|
/**
|
12842
13027
|
Adds a style to the style attribute which will be rendered to the element.
|
12843
13028
|
|
@@ -12871,8 +13056,9 @@ Ember._RenderBuffer.prototype =
|
|
12871
13056
|
id = this.elementId,
|
12872
13057
|
classes = this.classes,
|
12873
13058
|
attrs = this.elementAttributes,
|
13059
|
+
props = this.elementProperties,
|
12874
13060
|
style = this.elementStyle,
|
12875
|
-
prop;
|
13061
|
+
attr, prop;
|
12876
13062
|
|
12877
13063
|
buffer.push('<' + tagName);
|
12878
13064
|
|
@@ -12900,15 +13086,32 @@ Ember._RenderBuffer.prototype =
|
|
12900
13086
|
}
|
12901
13087
|
|
12902
13088
|
if (attrs) {
|
12903
|
-
for (
|
12904
|
-
if (attrs.hasOwnProperty(
|
12905
|
-
buffer.push(' ' +
|
13089
|
+
for (attr in attrs) {
|
13090
|
+
if (attrs.hasOwnProperty(attr)) {
|
13091
|
+
buffer.push(' ' + attr + '="' + this._escapeAttribute(attrs[attr]) + '"');
|
12906
13092
|
}
|
12907
13093
|
}
|
12908
13094
|
|
12909
13095
|
this.elementAttributes = null;
|
12910
13096
|
}
|
12911
13097
|
|
13098
|
+
if (props) {
|
13099
|
+
for (prop in props) {
|
13100
|
+
if (props.hasOwnProperty(prop)) {
|
13101
|
+
var value = props[prop];
|
13102
|
+
if (value || typeof(value) === 'number') {
|
13103
|
+
if (value === true) {
|
13104
|
+
buffer.push(' ' + prop + '="' + prop + '"');
|
13105
|
+
} else {
|
13106
|
+
buffer.push(' ' + prop + '="' + this._escapeAttribute(props[prop]) + '"');
|
13107
|
+
}
|
13108
|
+
}
|
13109
|
+
}
|
13110
|
+
}
|
13111
|
+
|
13112
|
+
this.elementProperties = null;
|
13113
|
+
}
|
13114
|
+
|
12912
13115
|
buffer.push('>');
|
12913
13116
|
},
|
12914
13117
|
|
@@ -12928,8 +13131,9 @@ Ember._RenderBuffer.prototype =
|
|
12928
13131
|
id = this.elementId,
|
12929
13132
|
classes = this.classes,
|
12930
13133
|
attrs = this.elementAttributes,
|
13134
|
+
props = this.elementProperties,
|
12931
13135
|
style = this.elementStyle,
|
12932
|
-
styleBuffer = '', prop;
|
13136
|
+
styleBuffer = '', attr, prop;
|
12933
13137
|
|
12934
13138
|
if (id) {
|
12935
13139
|
$element.attr('id', id);
|
@@ -12953,15 +13157,25 @@ Ember._RenderBuffer.prototype =
|
|
12953
13157
|
}
|
12954
13158
|
|
12955
13159
|
if (attrs) {
|
12956
|
-
for (
|
12957
|
-
if (attrs.hasOwnProperty(
|
12958
|
-
$element.attr(
|
13160
|
+
for (attr in attrs) {
|
13161
|
+
if (attrs.hasOwnProperty(attr)) {
|
13162
|
+
$element.attr(attr, attrs[attr]);
|
12959
13163
|
}
|
12960
13164
|
}
|
12961
13165
|
|
12962
13166
|
this.elementAttributes = null;
|
12963
13167
|
}
|
12964
13168
|
|
13169
|
+
if (props) {
|
13170
|
+
for (prop in props) {
|
13171
|
+
if (props.hasOwnProperty(prop)) {
|
13172
|
+
$element.prop(prop, props[prop]);
|
13173
|
+
}
|
13174
|
+
}
|
13175
|
+
|
13176
|
+
this.elementProperties = null;
|
13177
|
+
}
|
13178
|
+
|
12965
13179
|
return element;
|
12966
13180
|
},
|
12967
13181
|
|
@@ -13177,11 +13391,13 @@ Ember.EventDispatcher = Ember.Object.extend(
|
|
13177
13391
|
rootElement.delegate('[data-ember-action]', event + '.ember', function(evt) {
|
13178
13392
|
return Ember.handleErrors(function() {
|
13179
13393
|
var actionId = Ember.$(evt.currentTarget).attr('data-ember-action'),
|
13180
|
-
action = Ember.Handlebars.ActionHelper.registeredActions[actionId]
|
13181
|
-
handler = action.handler;
|
13394
|
+
action = Ember.Handlebars.ActionHelper.registeredActions[actionId];
|
13182
13395
|
|
13183
|
-
|
13184
|
-
|
13396
|
+
// We have to check for action here since in some cases, jQuery will trigger
|
13397
|
+
// an event on `removeChild` (i.e. focusout) after we've already torn down the
|
13398
|
+
// action handlers for the view.
|
13399
|
+
if (action && action.eventName === eventName) {
|
13400
|
+
return action.handler(evt);
|
13185
13401
|
}
|
13186
13402
|
}, this);
|
13187
13403
|
});
|
@@ -13270,7 +13486,25 @@ Ember.ControllerMixin.reopen({
|
|
13270
13486
|
target: null,
|
13271
13487
|
namespace: null,
|
13272
13488
|
view: null,
|
13273
|
-
container: null
|
13489
|
+
container: null,
|
13490
|
+
_childContainers: null,
|
13491
|
+
|
13492
|
+
init: function() {
|
13493
|
+
this._super();
|
13494
|
+
set(this, '_childContainers', {});
|
13495
|
+
},
|
13496
|
+
|
13497
|
+
_modelDidChange: Ember.observer(function() {
|
13498
|
+
var containers = get(this, '_childContainers'),
|
13499
|
+
container;
|
13500
|
+
|
13501
|
+
for (var prop in containers) {
|
13502
|
+
if (!containers.hasOwnProperty(prop)) { continue; }
|
13503
|
+
containers[prop].destroy();
|
13504
|
+
}
|
13505
|
+
|
13506
|
+
set(this, '_childContainers', {});
|
13507
|
+
}, 'model')
|
13274
13508
|
});
|
13275
13509
|
|
13276
13510
|
})();
|
@@ -13298,9 +13532,7 @@ var a_forEach = Ember.EnumerableUtils.forEach;
|
|
13298
13532
|
var a_addObject = Ember.EnumerableUtils.addObject;
|
13299
13533
|
|
13300
13534
|
var childViewsProperty = Ember.computed(function() {
|
13301
|
-
var childViews = this._childViews;
|
13302
|
-
|
13303
|
-
var ret = Ember.A();
|
13535
|
+
var childViews = this._childViews, ret = Ember.A(), view = this;
|
13304
13536
|
|
13305
13537
|
a_forEach(childViews, function(view) {
|
13306
13538
|
if (view.isVirtual) {
|
@@ -13310,6 +13542,14 @@ var childViewsProperty = Ember.computed(function() {
|
|
13310
13542
|
}
|
13311
13543
|
});
|
13312
13544
|
|
13545
|
+
ret.replace = function (idx, removedCount, addedViews) {
|
13546
|
+
if (view instanceof Ember.ContainerView) {
|
13547
|
+
Ember.deprecate("Manipulating a Ember.ContainerView through its childViews property is deprecated. Please use the ContainerView instance itself as an Ember.MutableArray.");
|
13548
|
+
return view.replace(idx, removedCount, addedViews);
|
13549
|
+
}
|
13550
|
+
throw new Error("childViews is immutable");
|
13551
|
+
};
|
13552
|
+
|
13313
13553
|
return ret;
|
13314
13554
|
});
|
13315
13555
|
|
@@ -13336,7 +13576,10 @@ Ember.CoreView = Ember.Object.extend(Ember.Evented, {
|
|
13336
13576
|
|
13337
13577
|
// Register the view for event handling. This hash is used by
|
13338
13578
|
// Ember.EventDispatcher to dispatch incoming events.
|
13339
|
-
if (!this.isVirtual)
|
13579
|
+
if (!this.isVirtual) {
|
13580
|
+
Ember.assert("Attempted to register a view with an id already in use: "+this.elementId, !Ember.View.views[this.elementId]);
|
13581
|
+
Ember.View.views[this.elementId] = this;
|
13582
|
+
}
|
13340
13583
|
|
13341
13584
|
this.addBeforeObserver('elementId', function() {
|
13342
13585
|
throw new Error("Changing a view's elementId after creation is not allowed");
|
@@ -14103,6 +14346,8 @@ Ember.View = Ember.CoreView.extend(
|
|
14103
14346
|
var templateName = get(this, 'templateName'),
|
14104
14347
|
template = this.templateForName(templateName, 'template');
|
14105
14348
|
|
14349
|
+
Ember.assert("You specified the templateName " + templateName + " for " + this + ", but it did not exist.", !templateName || template);
|
14350
|
+
|
14106
14351
|
return template || get(this, 'defaultTemplate');
|
14107
14352
|
}).property('templateName'),
|
14108
14353
|
|
@@ -14144,6 +14389,8 @@ Ember.View = Ember.CoreView.extend(
|
|
14144
14389
|
var layoutName = get(this, 'layoutName'),
|
14145
14390
|
layout = this.templateForName(layoutName, 'layout');
|
14146
14391
|
|
14392
|
+
Ember.assert("You specified the layoutName " + layoutName + " for " + this + ", but it did not exist.", !layoutName || layout);
|
14393
|
+
|
14147
14394
|
return layout || get(this, 'defaultLayout');
|
14148
14395
|
}).property('layoutName'),
|
14149
14396
|
|
@@ -14522,11 +14769,16 @@ Ember.View = Ember.CoreView.extend(
|
|
14522
14769
|
oldClass = dasherizedClass;
|
14523
14770
|
}
|
14524
14771
|
|
14525
|
-
|
14526
|
-
|
14772
|
+
this.registerObserver(this, parsedPath.path, observer);
|
14773
|
+
// Remove className so when the view is rerendered,
|
14774
|
+
// the className is added based on binding reevaluation
|
14527
14775
|
this.one('willClearRender', function() {
|
14528
|
-
|
14776
|
+
if (oldClass) {
|
14777
|
+
classNames.removeObject(oldClass);
|
14778
|
+
oldClass = null;
|
14779
|
+
}
|
14529
14780
|
});
|
14781
|
+
|
14530
14782
|
}, this);
|
14531
14783
|
},
|
14532
14784
|
|
@@ -14558,11 +14810,7 @@ Ember.View = Ember.CoreView.extend(
|
|
14558
14810
|
Ember.View.applyAttributeBindings(elem, attributeName, attributeValue);
|
14559
14811
|
};
|
14560
14812
|
|
14561
|
-
|
14562
|
-
|
14563
|
-
this.one('willClearRender', function() {
|
14564
|
-
removeObserver(this, property, observer);
|
14565
|
-
});
|
14813
|
+
this.registerObserver(this, property, observer);
|
14566
14814
|
|
14567
14815
|
// Determine the current value and add it to the render buffer
|
14568
14816
|
// if necessary.
|
@@ -14773,7 +15021,7 @@ Ember.View = Ember.CoreView.extend(
|
|
14773
15021
|
// element.
|
14774
15022
|
// In the interim, we will just re-render if that happens. It is more
|
14775
15023
|
// important than elements get garbage collected.
|
14776
|
-
this.destroyElement();
|
15024
|
+
if (!this.removedFromDOM) { this.destroyElement(); }
|
14777
15025
|
this.invokeRecursively(function(view) {
|
14778
15026
|
if (view.clearRenderedChildren) { view.clearRenderedChildren(); }
|
14779
15027
|
});
|
@@ -15248,12 +15496,17 @@ Ember.View = Ember.CoreView.extend(
|
|
15248
15496
|
// so collect any information we need before calling super.
|
15249
15497
|
var childViews = this._childViews,
|
15250
15498
|
parent = this._parentView,
|
15251
|
-
childLen;
|
15499
|
+
childLen, i;
|
15252
15500
|
|
15253
15501
|
// destroy the element -- this will avoid each child view destroying
|
15254
15502
|
// the element over and over again...
|
15255
15503
|
if (!this.removedFromDOM) { this.destroyElement(); }
|
15256
15504
|
|
15505
|
+
childLen = childViews.length;
|
15506
|
+
for (i=childLen-1; i>=0; i--) {
|
15507
|
+
childViews[i].removedFromDOM = true;
|
15508
|
+
}
|
15509
|
+
|
15257
15510
|
// remove from non-virtual parent view if viewName was specified
|
15258
15511
|
if (this.viewName) {
|
15259
15512
|
var nonVirtualParentView = get(this, 'parentView');
|
@@ -15270,8 +15523,7 @@ Ember.View = Ember.CoreView.extend(
|
|
15270
15523
|
this.transitionTo('destroyed');
|
15271
15524
|
|
15272
15525
|
childLen = childViews.length;
|
15273
|
-
for (
|
15274
|
-
childViews[i].removedFromDOM = true;
|
15526
|
+
for (i=childLen-1; i>=0; i--) {
|
15275
15527
|
childViews[i].destroy();
|
15276
15528
|
}
|
15277
15529
|
|
@@ -15416,6 +15668,14 @@ Ember.View = Ember.CoreView.extend(
|
|
15416
15668
|
*/
|
15417
15669
|
handleEvent: function(eventName, evt) {
|
15418
15670
|
return this.currentState.handleEvent(this, eventName, evt);
|
15671
|
+
},
|
15672
|
+
|
15673
|
+
registerObserver: function(root, path, target, observer) {
|
15674
|
+
Ember.addObserver(root, path, target, observer);
|
15675
|
+
|
15676
|
+
this.one('willClearRender', function() {
|
15677
|
+
Ember.removeObserver(root, path, target, observer);
|
15678
|
+
});
|
15419
15679
|
}
|
15420
15680
|
|
15421
15681
|
});
|
@@ -15606,13 +15866,17 @@ Ember.View.childViewsProperty = childViewsProperty;
|
|
15606
15866
|
|
15607
15867
|
Ember.View.applyAttributeBindings = function(elem, name, value) {
|
15608
15868
|
var type = Ember.typeOf(value);
|
15609
|
-
var currentValue = elem.attr(name);
|
15610
15869
|
|
15611
15870
|
// if this changes, also change the logic in ember-handlebars/lib/helpers/binding.js
|
15612
|
-
if ((type === 'string' || (type === 'number' && !isNaN(value)))
|
15613
|
-
elem.attr(name
|
15614
|
-
|
15615
|
-
|
15871
|
+
if (name !== 'value' && (type === 'string' || (type === 'number' && !isNaN(value)))) {
|
15872
|
+
if (value !== elem.attr(name)) {
|
15873
|
+
elem.attr(name, value);
|
15874
|
+
}
|
15875
|
+
} else if (name === 'value' || type === 'boolean') {
|
15876
|
+
if (value !== elem.prop(name)) {
|
15877
|
+
// value and booleans should always be properties
|
15878
|
+
elem.prop(name, value);
|
15879
|
+
}
|
15616
15880
|
} else if (!value) {
|
15617
15881
|
elem.removeAttr(name);
|
15618
15882
|
}
|
@@ -15965,14 +16229,9 @@ var states = Ember.View.cloneStates(Ember.View.states);
|
|
15965
16229
|
var get = Ember.get, set = Ember.set, meta = Ember.meta;
|
15966
16230
|
var forEach = Ember.EnumerableUtils.forEach;
|
15967
16231
|
|
15968
|
-
var childViewsProperty = Ember.computed(function() {
|
15969
|
-
return get(this, '_childViews');
|
15970
|
-
}).property('_childViews');
|
15971
|
-
|
15972
16232
|
/**
|
15973
|
-
A `ContainerView` is an `Ember.View` subclass that
|
15974
|
-
programatic management of
|
15975
|
-
update the `ContainerView` instance's rendered DOM representation.
|
16233
|
+
A `ContainerView` is an `Ember.View` subclass that implements `Ember.MutableArray`
|
16234
|
+
allowing programatic management of its child views.
|
15976
16235
|
|
15977
16236
|
## Setting Initial Child Views
|
15978
16237
|
|
@@ -16012,11 +16271,9 @@ var childViewsProperty = Ember.computed(function() {
|
|
16012
16271
|
|
16013
16272
|
## Adding and Removing Child Views
|
16014
16273
|
|
16015
|
-
The
|
16016
|
-
manipulating the `childViews` property directly.
|
16274
|
+
The container view implements `Ember.MutableArray` allowing programatic management of its child views.
|
16017
16275
|
|
16018
|
-
To remove a view pass that view into a `removeObject` call on the container
|
16019
|
-
`childViews` property.
|
16276
|
+
To remove a view, pass that view into a `removeObject` call on the container view.
|
16020
16277
|
|
16021
16278
|
Given an empty `<body>` the following code
|
16022
16279
|
|
@@ -16047,9 +16304,9 @@ var childViewsProperty = Ember.computed(function() {
|
|
16047
16304
|
Removing a view
|
16048
16305
|
|
16049
16306
|
```javascript
|
16050
|
-
aContainer.
|
16051
|
-
aContainer.
|
16052
|
-
aContainer.
|
16307
|
+
aContainer.toArray(); // [aContainer.aView, aContainer.bView]
|
16308
|
+
aContainer.removeObject(aContainer.get('bView'));
|
16309
|
+
aContainer.toArray(); // [aContainer.aView]
|
16053
16310
|
```
|
16054
16311
|
|
16055
16312
|
Will result in the following HTML
|
@@ -16061,7 +16318,7 @@ var childViewsProperty = Ember.computed(function() {
|
|
16061
16318
|
```
|
16062
16319
|
|
16063
16320
|
Similarly, adding a child view is accomplished by adding `Ember.View` instances to the
|
16064
|
-
container
|
16321
|
+
container view.
|
16065
16322
|
|
16066
16323
|
Given an empty `<body>` the following code
|
16067
16324
|
|
@@ -16096,9 +16353,9 @@ var childViewsProperty = Ember.computed(function() {
|
|
16096
16353
|
template: Ember.Handlebars.compile("Another view")
|
16097
16354
|
});
|
16098
16355
|
|
16099
|
-
aContainer.
|
16100
|
-
aContainer.
|
16101
|
-
aContainer.
|
16356
|
+
aContainer.toArray(); // [aContainer.aView, aContainer.bView]
|
16357
|
+
aContainer.pushObject(AnotherViewClass.create());
|
16358
|
+
aContainer.toArray(); // [aContainer.aView, aContainer.bView, <AnotherViewClass instance>]
|
16102
16359
|
```
|
16103
16360
|
|
16104
16361
|
Will result in the following HTML
|
@@ -16111,57 +16368,7 @@ var childViewsProperty = Ember.computed(function() {
|
|
16111
16368
|
</div>
|
16112
16369
|
```
|
16113
16370
|
|
16114
|
-
|
16115
|
-
to `remove` or `removeFromParent` or calls to a container's `removeChild` may
|
16116
|
-
not behave correctly.
|
16117
|
-
|
16118
|
-
Calling `remove()` on a child view will remove the view's HTML, but it will
|
16119
|
-
remain as part of its container's `childView`s property.
|
16120
|
-
|
16121
|
-
Calling `removeChild()` on the container will remove the passed view instance
|
16122
|
-
from the container's `childView`s but keep its HTML within the container's
|
16123
|
-
rendered view.
|
16124
|
-
|
16125
|
-
Calling `removeFromParent()` behaves as expected but should be avoided in
|
16126
|
-
favor of direct manipulation of a container's `childViews` property.
|
16127
|
-
|
16128
|
-
```javascript
|
16129
|
-
aContainer = Ember.ContainerView.create({
|
16130
|
-
classNames: ['the-container'],
|
16131
|
-
childViews: ['aView', 'bView'],
|
16132
|
-
aView: Ember.View.create({
|
16133
|
-
template: Ember.Handlebars.compile("A")
|
16134
|
-
}),
|
16135
|
-
bView: Ember.View.create({
|
16136
|
-
template: Ember.Handlebars.compile("B")
|
16137
|
-
})
|
16138
|
-
});
|
16139
|
-
|
16140
|
-
aContainer.appendTo('body');
|
16141
|
-
```
|
16142
|
-
|
16143
|
-
Results in the HTML
|
16144
|
-
|
16145
|
-
```html
|
16146
|
-
<div class="ember-view the-container">
|
16147
|
-
<div class="ember-view">A</div>
|
16148
|
-
<div class="ember-view">B</div>
|
16149
|
-
</div>
|
16150
|
-
```
|
16151
|
-
|
16152
|
-
Calling `aContainer.get('aView').removeFromParent()` will result in the
|
16153
|
-
following HTML
|
16154
|
-
|
16155
|
-
```html
|
16156
|
-
<div class="ember-view the-container">
|
16157
|
-
<div class="ember-view">B</div>
|
16158
|
-
</div>
|
16159
|
-
```
|
16160
|
-
|
16161
|
-
And the `Ember.View` instance stored in `aContainer.aView` will be removed from `aContainer`'s
|
16162
|
-
`childViews` array.
|
16163
|
-
|
16164
|
-
## Templates and Layout
|
16371
|
+
## Templates and Layout
|
16165
16372
|
|
16166
16373
|
A `template`, `templateName`, `defaultTemplate`, `layout`, `layoutName` or
|
16167
16374
|
`defaultLayout` property on a container view will not result in the template
|
@@ -16172,10 +16379,9 @@ var childViewsProperty = Ember.computed(function() {
|
|
16172
16379
|
|
16173
16380
|
If you would like to display a single view in your ContainerView, you can set
|
16174
16381
|
its `currentView` property. When the `currentView` property is set to a view
|
16175
|
-
instance, it will be added to the ContainerView
|
16176
|
-
|
16177
|
-
|
16178
|
-
`currentView` will be removed.
|
16382
|
+
instance, it will be added to the ContainerView. If the `currentView` property
|
16383
|
+
is later changed to a different view, the new view will replace the old view.
|
16384
|
+
If `currentView` is set to `null`, the last `currentView` will be removed.
|
16179
16385
|
|
16180
16386
|
This functionality is useful for cases where you want to bind the display of
|
16181
16387
|
a ContainerView to a controller or state manager. For example, you can bind
|
@@ -16197,15 +16403,16 @@ var childViewsProperty = Ember.computed(function() {
|
|
16197
16403
|
@namespace Ember
|
16198
16404
|
@extends Ember.View
|
16199
16405
|
*/
|
16200
|
-
|
16201
|
-
Ember.ContainerView = Ember.View.extend({
|
16406
|
+
Ember.ContainerView = Ember.View.extend(Ember.MutableArray, {
|
16202
16407
|
states: states,
|
16203
16408
|
|
16204
16409
|
init: function() {
|
16205
16410
|
this._super();
|
16206
16411
|
|
16207
16412
|
var childViews = get(this, 'childViews');
|
16208
|
-
|
16413
|
+
|
16414
|
+
// redefine view's childViews property that was obliterated
|
16415
|
+
Ember.defineProperty(this, 'childViews', Ember.View.childViewsProperty);
|
16209
16416
|
|
16210
16417
|
var _childViews = this._childViews;
|
16211
16418
|
|
@@ -16224,20 +16431,38 @@ Ember.ContainerView = Ember.View.extend({
|
|
16224
16431
|
}, this);
|
16225
16432
|
|
16226
16433
|
var currentView = get(this, 'currentView');
|
16227
|
-
if (currentView)
|
16434
|
+
if (currentView) {
|
16435
|
+
_childViews.push(this.createChildView(currentView));
|
16436
|
+
}
|
16437
|
+
},
|
16228
16438
|
|
16229
|
-
|
16230
|
-
|
16439
|
+
replace: function(idx, removedCount, addedViews) {
|
16440
|
+
var addedCount = addedViews ? get(addedViews, 'length') : 0;
|
16231
16441
|
|
16232
|
-
|
16233
|
-
|
16234
|
-
|
16235
|
-
|
16236
|
-
|
16237
|
-
|
16238
|
-
|
16442
|
+
this.arrayContentWillChange(idx, removedCount, addedCount);
|
16443
|
+
this.childViewsWillChange(this._childViews, idx, removedCount);
|
16444
|
+
|
16445
|
+
if (addedCount === 0) {
|
16446
|
+
this._childViews.splice(idx, removedCount) ;
|
16447
|
+
} else {
|
16448
|
+
var args = [idx, removedCount].concat(addedViews);
|
16449
|
+
this._childViews.splice.apply(this._childViews, args);
|
16450
|
+
}
|
16451
|
+
|
16452
|
+
this.arrayContentDidChange(idx, removedCount, addedCount);
|
16453
|
+
this.childViewsDidChange(this._childViews, idx, removedCount, addedCount);
|
16454
|
+
|
16455
|
+
return this;
|
16456
|
+
},
|
16457
|
+
|
16458
|
+
objectAt: function(idx) {
|
16459
|
+
return this._childViews[idx];
|
16239
16460
|
},
|
16240
16461
|
|
16462
|
+
length: Ember.computed(function () {
|
16463
|
+
return this._childViews.length;
|
16464
|
+
}),
|
16465
|
+
|
16241
16466
|
/**
|
16242
16467
|
@private
|
16243
16468
|
|
@@ -16254,23 +16479,6 @@ Ember.ContainerView = Ember.View.extend({
|
|
16254
16479
|
|
16255
16480
|
instrumentName: 'render.container',
|
16256
16481
|
|
16257
|
-
/**
|
16258
|
-
@private
|
16259
|
-
|
16260
|
-
When the container view is destroyed, tear down the child views
|
16261
|
-
array observer.
|
16262
|
-
|
16263
|
-
@method willDestroy
|
16264
|
-
*/
|
16265
|
-
willDestroy: function() {
|
16266
|
-
get(this, 'childViews').removeArrayObserver(this, {
|
16267
|
-
willChange: 'childViewsWillChange',
|
16268
|
-
didChange: 'childViewsDidChange'
|
16269
|
-
});
|
16270
|
-
|
16271
|
-
this._super();
|
16272
|
-
},
|
16273
|
-
|
16274
16482
|
/**
|
16275
16483
|
@private
|
16276
16484
|
|
@@ -16286,12 +16494,19 @@ Ember.ContainerView = Ember.View.extend({
|
|
16286
16494
|
@param {Number} removed the number of child views removed
|
16287
16495
|
**/
|
16288
16496
|
childViewsWillChange: function(views, start, removed) {
|
16289
|
-
|
16497
|
+
this.propertyWillChange('childViews');
|
16290
16498
|
|
16291
|
-
|
16292
|
-
|
16499
|
+
if (removed > 0) {
|
16500
|
+
var changedViews = views.slice(start, start+removed);
|
16501
|
+
// transition to preRender before clearing parentView
|
16502
|
+
this.currentState.childViewsWillChange(this, views, start, removed);
|
16503
|
+
this.initializeViews(changedViews, null, null);
|
16504
|
+
}
|
16505
|
+
},
|
16293
16506
|
|
16294
|
-
|
16507
|
+
removeChild: function(child) {
|
16508
|
+
this.removeObject(child);
|
16509
|
+
return this;
|
16295
16510
|
},
|
16296
16511
|
|
16297
16512
|
/**
|
@@ -16312,16 +16527,12 @@ Ember.ContainerView = Ember.View.extend({
|
|
16312
16527
|
@param {Number} the number of child views added
|
16313
16528
|
*/
|
16314
16529
|
childViewsDidChange: function(views, start, removed, added) {
|
16315
|
-
|
16316
|
-
|
16317
|
-
|
16318
|
-
|
16319
|
-
|
16320
|
-
|
16321
|
-
this.initializeViews(changedViews, this, get(this, 'templateData'));
|
16322
|
-
|
16323
|
-
// Let the current state handle the changes
|
16324
|
-
this.currentState.childViewsDidChange(this, views, start, added);
|
16530
|
+
if (added > 0) {
|
16531
|
+
var changedViews = views.slice(start, start+added);
|
16532
|
+
this.initializeViews(changedViews, this, get(this, 'templateData'));
|
16533
|
+
this.currentState.childViewsDidChange(this, views, start, added);
|
16534
|
+
}
|
16535
|
+
this.propertyDidChange('childViews');
|
16325
16536
|
},
|
16326
16537
|
|
16327
16538
|
initializeViews: function(views, parentView, templateData) {
|
@@ -16337,21 +16548,16 @@ Ember.ContainerView = Ember.View.extend({
|
|
16337
16548
|
currentView: null,
|
16338
16549
|
|
16339
16550
|
_currentViewWillChange: Ember.beforeObserver(function() {
|
16340
|
-
var
|
16341
|
-
currentView = get(this, 'currentView');
|
16342
|
-
|
16551
|
+
var currentView = get(this, 'currentView');
|
16343
16552
|
if (currentView) {
|
16344
16553
|
currentView.destroy();
|
16345
|
-
childViews.removeObject(currentView);
|
16346
16554
|
}
|
16347
16555
|
}, 'currentView'),
|
16348
16556
|
|
16349
16557
|
_currentViewDidChange: Ember.observer(function() {
|
16350
|
-
var
|
16351
|
-
currentView = get(this, 'currentView');
|
16352
|
-
|
16558
|
+
var currentView = get(this, 'currentView');
|
16353
16559
|
if (currentView) {
|
16354
|
-
|
16560
|
+
this.pushObject(currentView);
|
16355
16561
|
}
|
16356
16562
|
}, 'currentView'),
|
16357
16563
|
|
@@ -16384,7 +16590,7 @@ Ember.merge(states.hasElement, {
|
|
16384
16590
|
},
|
16385
16591
|
|
16386
16592
|
ensureChildrenAreInDOM: function(view) {
|
16387
|
-
var childViews = view.
|
16593
|
+
var childViews = view._childViews, i, len, childView, previous, buffer;
|
16388
16594
|
for (i = 0, len = childViews.length; i < len; i++) {
|
16389
16595
|
childView = childViews[i];
|
16390
16596
|
buffer = childView.renderToBufferIfNeeded();
|
@@ -16649,6 +16855,10 @@ Ember.CollectionView = Ember.ContainerView.extend(
|
|
16649
16855
|
if (content) { content.removeArrayObserver(this); }
|
16650
16856
|
|
16651
16857
|
this._super();
|
16858
|
+
|
16859
|
+
if (this._createdEmptyView) {
|
16860
|
+
this._createdEmptyView.destroy();
|
16861
|
+
}
|
16652
16862
|
},
|
16653
16863
|
|
16654
16864
|
arrayWillChange: function(content, start, removedCount) {
|
@@ -16662,9 +16872,9 @@ Ember.CollectionView = Ember.ContainerView.extend(
|
|
16662
16872
|
// Loop through child views that correspond with the removed items.
|
16663
16873
|
// Note that we loop from the end of the array to the beginning because
|
16664
16874
|
// we are mutating it as we go.
|
16665
|
-
var childViews =
|
16875
|
+
var childViews = this._childViews, childView, idx, len;
|
16666
16876
|
|
16667
|
-
len =
|
16877
|
+
len = this._childViews.length;
|
16668
16878
|
|
16669
16879
|
var removingAll = removedCount === len;
|
16670
16880
|
|
@@ -16694,7 +16904,6 @@ Ember.CollectionView = Ember.ContainerView.extend(
|
|
16694
16904
|
*/
|
16695
16905
|
arrayDidChange: function(content, start, removed, added) {
|
16696
16906
|
var itemViewClass = get(this, 'itemViewClass'),
|
16697
|
-
childViews = get(this, 'childViews'),
|
16698
16907
|
addedViews = [], view, item, idx, len, itemTagName;
|
16699
16908
|
|
16700
16909
|
if ('string' === typeof itemViewClass) {
|
@@ -16719,11 +16928,15 @@ Ember.CollectionView = Ember.ContainerView.extend(
|
|
16719
16928
|
var emptyView = get(this, 'emptyView');
|
16720
16929
|
if (!emptyView) { return; }
|
16721
16930
|
|
16931
|
+
var isClass = Ember.CoreView.detect(emptyView);
|
16932
|
+
|
16722
16933
|
emptyView = this.createChildView(emptyView);
|
16723
16934
|
addedViews.push(emptyView);
|
16724
16935
|
set(this, 'emptyView', emptyView);
|
16936
|
+
|
16937
|
+
if (isClass) { this._createdEmptyView = emptyView; }
|
16725
16938
|
}
|
16726
|
-
|
16939
|
+
this.replace(start, 0, addedViews);
|
16727
16940
|
},
|
16728
16941
|
|
16729
16942
|
createChildView: function(view, attrs) {
|
@@ -17258,7 +17471,7 @@ var objectCreate = Object.create || function(parent) {
|
|
17258
17471
|
};
|
17259
17472
|
|
17260
17473
|
var Handlebars = this.Handlebars || Ember.imports.Handlebars;
|
17261
|
-
Ember.assert("Ember Handlebars requires Handlebars 1.0.
|
17474
|
+
Ember.assert("Ember Handlebars requires Handlebars 1.0.0-rc.3 or greater", Handlebars && Handlebars.VERSION.match(/^1\.0\.[0-9](\.rc\.[23456789]+)?/));
|
17262
17475
|
|
17263
17476
|
/**
|
17264
17477
|
Prepares the Handlebars templating library for use inside Ember's view
|
@@ -17335,6 +17548,8 @@ Ember.Handlebars.JavaScriptCompiler.prototype.appendToBuffer = function(string)
|
|
17335
17548
|
return "data.buffer.push("+string+");";
|
17336
17549
|
};
|
17337
17550
|
|
17551
|
+
var prefix = "ember" + (+new Date()), incr = 1;
|
17552
|
+
|
17338
17553
|
/**
|
17339
17554
|
@private
|
17340
17555
|
|
@@ -17347,8 +17562,11 @@ Ember.Handlebars.JavaScriptCompiler.prototype.appendToBuffer = function(string)
|
|
17347
17562
|
@param mustache
|
17348
17563
|
*/
|
17349
17564
|
Ember.Handlebars.Compiler.prototype.mustache = function(mustache) {
|
17350
|
-
if (mustache.
|
17351
|
-
|
17565
|
+
if (mustache.isHelper && mustache.id.string === 'control') {
|
17566
|
+
mustache.hash = mustache.hash || new Handlebars.AST.HashNode([]);
|
17567
|
+
mustache.hash.pairs.push(["controlID", new Handlebars.AST.StringNode(prefix + incr++)]);
|
17568
|
+
} else if (mustache.params.length || mustache.hash) {
|
17569
|
+
// no changes required
|
17352
17570
|
} else {
|
17353
17571
|
var id = new Handlebars.AST.IdNode(['_triageMustache']);
|
17354
17572
|
|
@@ -17360,8 +17578,9 @@ Ember.Handlebars.Compiler.prototype.mustache = function(mustache) {
|
|
17360
17578
|
mustache.hash.pairs.push(["unescaped", new Handlebars.AST.StringNode("true")]);
|
17361
17579
|
}
|
17362
17580
|
mustache = new Handlebars.AST.MustacheNode([id].concat([mustache.id]), mustache.hash, !mustache.escaped);
|
17363
|
-
return Handlebars.Compiler.prototype.mustache.call(this, mustache);
|
17364
17581
|
}
|
17582
|
+
|
17583
|
+
return Handlebars.Compiler.prototype.mustache.call(this, mustache);
|
17365
17584
|
};
|
17366
17585
|
|
17367
17586
|
/**
|
@@ -17420,6 +17639,8 @@ if (Handlebars.compile) {
|
|
17420
17639
|
})();
|
17421
17640
|
|
17422
17641
|
(function() {
|
17642
|
+
var slice = Array.prototype.slice;
|
17643
|
+
|
17423
17644
|
/**
|
17424
17645
|
@private
|
17425
17646
|
|
@@ -17474,7 +17695,7 @@ var normalizePath = Ember.Handlebars.normalizePath = function(root, path, data)
|
|
17474
17695
|
@param {String} path The path to be lookedup
|
17475
17696
|
@param {Object} options The template's option hash
|
17476
17697
|
*/
|
17477
|
-
Ember.Handlebars.get = function(root, path, options) {
|
17698
|
+
var handlebarsGet = Ember.Handlebars.get = function(root, path, options) {
|
17478
17699
|
var data = options && options.data,
|
17479
17700
|
normalizedPath = normalizePath(root, path, data),
|
17480
17701
|
value;
|
@@ -17496,6 +17717,41 @@ Ember.Handlebars.get = function(root, path, options) {
|
|
17496
17717
|
};
|
17497
17718
|
Ember.Handlebars.getPath = Ember.deprecateFunc('`Ember.Handlebars.getPath` has been changed to `Ember.Handlebars.get` for consistency.', Ember.Handlebars.get);
|
17498
17719
|
|
17720
|
+
Ember.Handlebars.resolveParams = function(context, params, options) {
|
17721
|
+
var resolvedParams = [], types = options.types, param, type;
|
17722
|
+
|
17723
|
+
for (var i=0, l=params.length; i<l; i++) {
|
17724
|
+
param = params[i];
|
17725
|
+
type = types[i];
|
17726
|
+
|
17727
|
+
if (type === 'ID') {
|
17728
|
+
resolvedParams.push(handlebarsGet(context, param, options));
|
17729
|
+
} else {
|
17730
|
+
resolvedParams.push(param);
|
17731
|
+
}
|
17732
|
+
}
|
17733
|
+
|
17734
|
+
return resolvedParams;
|
17735
|
+
};
|
17736
|
+
|
17737
|
+
Ember.Handlebars.resolveHash = function(context, hash, options) {
|
17738
|
+
var resolvedHash = {}, types = options.hashTypes, type;
|
17739
|
+
|
17740
|
+
for (var key in hash) {
|
17741
|
+
if (!hash.hasOwnProperty(key)) { continue; }
|
17742
|
+
|
17743
|
+
type = types[key];
|
17744
|
+
|
17745
|
+
if (type === 'ID') {
|
17746
|
+
resolvedHash[key] = handlebarsGet(context, hash[key], options);
|
17747
|
+
} else {
|
17748
|
+
resolvedHash[key] = hash[key];
|
17749
|
+
}
|
17750
|
+
}
|
17751
|
+
|
17752
|
+
return resolvedHash;
|
17753
|
+
};
|
17754
|
+
|
17499
17755
|
/**
|
17500
17756
|
@private
|
17501
17757
|
|
@@ -17565,6 +17821,18 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) {
|
|
17565
17821
|
{{repeat text count=3}}
|
17566
17822
|
```
|
17567
17823
|
|
17824
|
+
## Example with bound options
|
17825
|
+
|
17826
|
+
Bound hash options are also supported. Example:
|
17827
|
+
|
17828
|
+
```handlebars
|
17829
|
+
{{repeat text countBinding="numRepeats"}}
|
17830
|
+
```
|
17831
|
+
|
17832
|
+
In this example, count will be bound to the value of
|
17833
|
+
the `numRepeats` property on the context. If that property
|
17834
|
+
changes, the helper will be re-rendered.
|
17835
|
+
|
17568
17836
|
## Example with extra dependencies
|
17569
17837
|
|
17570
17838
|
The `Ember.Handlebars.registerBoundHelper` method takes a variable length
|
@@ -17577,6 +17845,37 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) {
|
|
17577
17845
|
}, 'name');
|
17578
17846
|
```
|
17579
17847
|
|
17848
|
+
## Example with multiple bound properties
|
17849
|
+
|
17850
|
+
`Ember.Handlebars.registerBoundHelper` supports binding to
|
17851
|
+
multiple properties, e.g.:
|
17852
|
+
|
17853
|
+
```javascript
|
17854
|
+
Ember.Handlebars.registerBoundHelper('concatenate', function() {
|
17855
|
+
var values = arguments[arguments.length - 1];
|
17856
|
+
return values.join('||');
|
17857
|
+
});
|
17858
|
+
```
|
17859
|
+
|
17860
|
+
Which allows for template syntax such as {{concatenate prop1 prop2}} or
|
17861
|
+
{{concatenate prop1 prop2 prop3}}. If any of the properties change,
|
17862
|
+
the helpr will re-render. Note that dependency keys cannot be
|
17863
|
+
using in conjunction with multi-property helpers, since it is ambiguous
|
17864
|
+
which property the dependent keys would belong to.
|
17865
|
+
|
17866
|
+
## Use with unbound helper
|
17867
|
+
|
17868
|
+
The {{unbound}} helper can be used with bound helper invocations
|
17869
|
+
to render them in their unbound form, e.g.
|
17870
|
+
|
17871
|
+
```handlebars
|
17872
|
+
{{unbound capitalize name}}
|
17873
|
+
```
|
17874
|
+
|
17875
|
+
In this example, if the name property changes, the helper
|
17876
|
+
will not re-render.
|
17877
|
+
|
17878
|
+
|
17580
17879
|
@method registerBoundHelper
|
17581
17880
|
@for Ember.Handlebars
|
17582
17881
|
@param {String} name
|
@@ -17584,15 +17883,50 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) {
|
|
17584
17883
|
@param {String} dependentKeys*
|
17585
17884
|
*/
|
17586
17885
|
Ember.Handlebars.registerBoundHelper = function(name, fn) {
|
17587
|
-
var dependentKeys =
|
17588
|
-
|
17589
|
-
|
17886
|
+
var dependentKeys = slice.call(arguments, 2);
|
17887
|
+
|
17888
|
+
function helper() {
|
17889
|
+
var properties = slice.call(arguments, 0, -1),
|
17890
|
+
numProperties = properties.length,
|
17891
|
+
options = arguments[arguments.length - 1],
|
17892
|
+
normalizedProperties = [],
|
17893
|
+
data = options.data,
|
17894
|
+
hash = options.hash,
|
17590
17895
|
view = data.view,
|
17591
17896
|
currentContext = (options.contexts && options.contexts[0]) || this,
|
17592
|
-
|
17593
|
-
|
17897
|
+
normalized,
|
17898
|
+
pathRoot, path,
|
17899
|
+
loc, hashOption;
|
17900
|
+
|
17901
|
+
// Detect bound options (e.g. countBinding="otherCount")
|
17902
|
+
hash.boundOptions = {};
|
17903
|
+
for (hashOption in hash) {
|
17904
|
+
if (!hash.hasOwnProperty(hashOption)) { continue; }
|
17905
|
+
|
17906
|
+
if (Ember.IS_BINDING.test(hashOption) && typeof hash[hashOption] === 'string') {
|
17907
|
+
// Lop off 'Binding' suffix.
|
17908
|
+
hash.boundOptions[hashOption.slice(0, -7)] = hash[hashOption];
|
17909
|
+
}
|
17910
|
+
}
|
17594
17911
|
|
17595
|
-
|
17912
|
+
// Expose property names on data.properties object.
|
17913
|
+
data.properties = [];
|
17914
|
+
for (loc = 0; loc < numProperties; ++loc) {
|
17915
|
+
data.properties.push(properties[loc]);
|
17916
|
+
normalizedProperties.push(normalizePath(currentContext, properties[loc], data));
|
17917
|
+
}
|
17918
|
+
|
17919
|
+
if (data.isUnbound) {
|
17920
|
+
return evaluateUnboundHelper(this, fn, normalizedProperties, options);
|
17921
|
+
}
|
17922
|
+
|
17923
|
+
if (dependentKeys.length === 0) {
|
17924
|
+
return evaluateMultiPropertyBoundHelper(currentContext, fn, normalizedProperties, options);
|
17925
|
+
}
|
17926
|
+
|
17927
|
+
Ember.assert("Dependent keys can only be used with single-property helpers.", properties.length === 1);
|
17928
|
+
|
17929
|
+
normalized = normalizedProperties[0];
|
17596
17930
|
|
17597
17931
|
pathRoot = normalized.root;
|
17598
17932
|
path = normalized.path;
|
@@ -17608,28 +17942,116 @@ Ember.Handlebars.registerBoundHelper = function(name, fn) {
|
|
17608
17942
|
|
17609
17943
|
view.appendChild(bindView);
|
17610
17944
|
|
17611
|
-
|
17612
|
-
Ember.run.scheduleOnce('render', bindView, 'rerender');
|
17613
|
-
};
|
17945
|
+
view.registerObserver(pathRoot, path, bindView, rerenderBoundHelperView);
|
17614
17946
|
|
17615
|
-
|
17616
|
-
|
17617
|
-
while(loc < dependentKeys.length) {
|
17618
|
-
Ember.addObserver(pathRoot, path + '.' + dependentKeys[loc], observer);
|
17619
|
-
loc += 1;
|
17947
|
+
for (var i=0, l=dependentKeys.length; i<l; i++) {
|
17948
|
+
view.registerObserver(pathRoot, path + '.' + dependentKeys[i], bindView, rerenderBoundHelperView);
|
17620
17949
|
}
|
17950
|
+
}
|
17621
17951
|
|
17622
|
-
|
17623
|
-
|
17624
|
-
loc = 0;
|
17625
|
-
while(loc < dependentKeys.length) {
|
17626
|
-
Ember.removeObserver(pathRoot, path + '.' + dependentKeys[loc], observer);
|
17627
|
-
loc += 1;
|
17628
|
-
}
|
17629
|
-
});
|
17630
|
-
});
|
17952
|
+
helper._rawFunction = fn;
|
17953
|
+
Ember.Handlebars.registerHelper(name, helper);
|
17631
17954
|
};
|
17632
17955
|
|
17956
|
+
/**
|
17957
|
+
@private
|
17958
|
+
|
17959
|
+
Renders the unbound form of an otherwise bound helper function.
|
17960
|
+
|
17961
|
+
@param {Function} fn
|
17962
|
+
@param {Object} context
|
17963
|
+
@param {Array} normalizedProperties
|
17964
|
+
@param {String} options
|
17965
|
+
*/
|
17966
|
+
function evaluateMultiPropertyBoundHelper(context, fn, normalizedProperties, options) {
|
17967
|
+
var numProperties = normalizedProperties.length,
|
17968
|
+
self = this,
|
17969
|
+
data = options.data,
|
17970
|
+
view = data.view,
|
17971
|
+
hash = options.hash,
|
17972
|
+
boundOptions = hash.boundOptions,
|
17973
|
+
watchedProperties,
|
17974
|
+
boundOption, bindView, loc, property, len;
|
17975
|
+
|
17976
|
+
bindView = new Ember._SimpleHandlebarsView(null, null, !hash.unescaped, data);
|
17977
|
+
bindView.normalizedValue = function() {
|
17978
|
+
var args = [], value, boundOption;
|
17979
|
+
|
17980
|
+
// Copy over bound options.
|
17981
|
+
for (boundOption in boundOptions) {
|
17982
|
+
if (!boundOptions.hasOwnProperty(boundOption)) { continue; }
|
17983
|
+
property = normalizePath(context, boundOptions[boundOption], data);
|
17984
|
+
bindView.path = property.path;
|
17985
|
+
bindView.pathRoot = property.root;
|
17986
|
+
hash[boundOption] = Ember._SimpleHandlebarsView.prototype.normalizedValue.call(bindView);
|
17987
|
+
}
|
17988
|
+
|
17989
|
+
for (loc = 0; loc < numProperties; ++loc) {
|
17990
|
+
property = normalizedProperties[loc];
|
17991
|
+
bindView.path = property.path;
|
17992
|
+
bindView.pathRoot = property.root;
|
17993
|
+
args.push(Ember._SimpleHandlebarsView.prototype.normalizedValue.call(bindView));
|
17994
|
+
}
|
17995
|
+
args.push(options);
|
17996
|
+
return fn.apply(context, args);
|
17997
|
+
};
|
17998
|
+
|
17999
|
+
view.appendChild(bindView);
|
18000
|
+
|
18001
|
+
// Assemble liast of watched properties that'll re-render this helper.
|
18002
|
+
watchedProperties = [];
|
18003
|
+
for (boundOption in boundOptions) {
|
18004
|
+
if (boundOptions.hasOwnProperty(boundOption)) {
|
18005
|
+
watchedProperties.push(normalizePath(context, boundOptions[boundOption], data));
|
18006
|
+
}
|
18007
|
+
}
|
18008
|
+
watchedProperties = watchedProperties.concat(normalizedProperties);
|
18009
|
+
|
18010
|
+
// Observe each property.
|
18011
|
+
for (loc = 0, len = watchedProperties.length; loc < len; ++loc) {
|
18012
|
+
property = watchedProperties[loc];
|
18013
|
+
view.registerObserver(property.root, property.path, bindView, rerenderBoundHelperView);
|
18014
|
+
}
|
18015
|
+
|
18016
|
+
}
|
18017
|
+
|
18018
|
+
/**
|
18019
|
+
@private
|
18020
|
+
|
18021
|
+
An observer function used with bound helpers which
|
18022
|
+
will schedule a re-render of the _SimpleHandlebarsView
|
18023
|
+
connected with the helper.
|
18024
|
+
*/
|
18025
|
+
function rerenderBoundHelperView() {
|
18026
|
+
Ember.run.scheduleOnce('render', this, 'rerender');
|
18027
|
+
}
|
18028
|
+
|
18029
|
+
/**
|
18030
|
+
@private
|
18031
|
+
|
18032
|
+
Renders the unbound form of an otherwise bound helper function.
|
18033
|
+
|
18034
|
+
@param {Function} fn
|
18035
|
+
@param {Object} context
|
18036
|
+
@param {Array} normalizedProperties
|
18037
|
+
@param {String} options
|
18038
|
+
*/
|
18039
|
+
function evaluateUnboundHelper(context, fn, normalizedProperties, options) {
|
18040
|
+
var args = [], hash = options.hash, boundOptions = hash.boundOptions, loc, len, property, boundOption;
|
18041
|
+
|
18042
|
+
for (boundOption in boundOptions) {
|
18043
|
+
if (!boundOptions.hasOwnProperty(boundOption)) { continue; }
|
18044
|
+
hash[boundOption] = Ember.Handlebars.get(context, boundOptions[boundOption], options);
|
18045
|
+
}
|
18046
|
+
|
18047
|
+
for(loc = 0, len = normalizedProperties.length; loc < len; ++loc) {
|
18048
|
+
property = normalizedProperties[loc];
|
18049
|
+
args.push(Ember.Handlebars.get(context, property.path, options));
|
18050
|
+
}
|
18051
|
+
args.push(options);
|
18052
|
+
return fn.apply(context, args);
|
18053
|
+
}
|
18054
|
+
|
17633
18055
|
/**
|
17634
18056
|
@private
|
17635
18057
|
|
@@ -17733,7 +18155,7 @@ var DOMManager = {
|
|
17733
18155
|
view.transitionTo('preRender');
|
17734
18156
|
|
17735
18157
|
Ember.run.schedule('render', this, function() {
|
17736
|
-
if (
|
18158
|
+
if (view.isDestroying) { return; }
|
17737
18159
|
|
17738
18160
|
view.clearRenderedChildren();
|
17739
18161
|
var buffer = view.renderToBuffer();
|
@@ -18154,20 +18576,16 @@ var EmberHandlebars = Ember.Handlebars, helpers = EmberHandlebars.helpers;
|
|
18154
18576
|
|
18155
18577
|
// Binds a property into the DOM. This will create a hook in DOM that the
|
18156
18578
|
// KVO system will look for and update if the property changes.
|
18157
|
-
function bind(property, options, preserveContext, shouldDisplay, valueNormalizer) {
|
18579
|
+
function bind(property, options, preserveContext, shouldDisplay, valueNormalizer, childProperties) {
|
18158
18580
|
var data = options.data,
|
18159
18581
|
fn = options.fn,
|
18160
18582
|
inverse = options.inverse,
|
18161
18583
|
view = data.view,
|
18162
18584
|
currentContext = this,
|
18163
|
-
|
18164
|
-
observer;
|
18585
|
+
normalized, observer, i;
|
18165
18586
|
|
18166
18587
|
normalized = normalizePath(currentContext, property, data);
|
18167
18588
|
|
18168
|
-
pathRoot = normalized.root;
|
18169
|
-
path = normalized.path;
|
18170
|
-
|
18171
18589
|
// Set up observers for observable objects
|
18172
18590
|
if ('object' === typeof this) {
|
18173
18591
|
if (data.insideGroup) {
|
@@ -18175,7 +18593,7 @@ function bind(property, options, preserveContext, shouldDisplay, valueNormalizer
|
|
18175
18593
|
Ember.run.once(view, 'rerender');
|
18176
18594
|
};
|
18177
18595
|
|
18178
|
-
var template, context, result = handlebarsGet(
|
18596
|
+
var template, context, result = handlebarsGet(currentContext, property, options);
|
18179
18597
|
|
18180
18598
|
result = valueNormalizer(result);
|
18181
18599
|
|
@@ -18197,8 +18615,8 @@ function bind(property, options, preserveContext, shouldDisplay, valueNormalizer
|
|
18197
18615
|
valueNormalizerFunc: valueNormalizer,
|
18198
18616
|
displayTemplate: fn,
|
18199
18617
|
inverseTemplate: inverse,
|
18200
|
-
path:
|
18201
|
-
pathRoot:
|
18618
|
+
path: property,
|
18619
|
+
pathRoot: currentContext,
|
18202
18620
|
previousContext: currentContext,
|
18203
18621
|
isEscaped: !options.hash.unescaped,
|
18204
18622
|
templateData: options.data
|
@@ -18215,17 +18633,18 @@ function bind(property, options, preserveContext, shouldDisplay, valueNormalizer
|
|
18215
18633
|
// tells the Ember._HandlebarsBoundView to re-render. If property
|
18216
18634
|
// is an empty string, we are printing the current context
|
18217
18635
|
// object ({{this}}) so updating it is not our responsibility.
|
18218
|
-
if (path !== '') {
|
18219
|
-
|
18220
|
-
|
18221
|
-
|
18222
|
-
|
18223
|
-
|
18636
|
+
if (normalized.path !== '') {
|
18637
|
+
view.registerObserver(normalized.root, normalized.path, observer);
|
18638
|
+
if (childProperties) {
|
18639
|
+
for (i=0; i<childProperties.length; i++) {
|
18640
|
+
view.registerObserver(normalized.root, normalized.path+'.'+childProperties[i], observer);
|
18641
|
+
}
|
18642
|
+
}
|
18224
18643
|
}
|
18225
18644
|
} else {
|
18226
18645
|
// The object is not observable, so just render it out and
|
18227
18646
|
// be done with it.
|
18228
|
-
data.buffer.push(handlebarsGet(
|
18647
|
+
data.buffer.push(handlebarsGet(currentContext, property, options));
|
18229
18648
|
}
|
18230
18649
|
}
|
18231
18650
|
|
@@ -18233,14 +18652,10 @@ function simpleBind(property, options) {
|
|
18233
18652
|
var data = options.data,
|
18234
18653
|
view = data.view,
|
18235
18654
|
currentContext = this,
|
18236
|
-
|
18237
|
-
observer;
|
18655
|
+
normalized, observer;
|
18238
18656
|
|
18239
18657
|
normalized = normalizePath(currentContext, property, data);
|
18240
18658
|
|
18241
|
-
pathRoot = normalized.root;
|
18242
|
-
path = normalized.path;
|
18243
|
-
|
18244
18659
|
// Set up observers for observable objects
|
18245
18660
|
if ('object' === typeof this) {
|
18246
18661
|
if (data.insideGroup) {
|
@@ -18248,12 +18663,12 @@ function simpleBind(property, options) {
|
|
18248
18663
|
Ember.run.once(view, 'rerender');
|
18249
18664
|
};
|
18250
18665
|
|
18251
|
-
var result = handlebarsGet(
|
18666
|
+
var result = handlebarsGet(currentContext, property, options);
|
18252
18667
|
if (result === null || result === undefined) { result = ""; }
|
18253
18668
|
data.buffer.push(result);
|
18254
18669
|
} else {
|
18255
18670
|
var bindView = new Ember._SimpleHandlebarsView(
|
18256
|
-
|
18671
|
+
property, currentContext, !options.hash.unescaped, options.data
|
18257
18672
|
);
|
18258
18673
|
|
18259
18674
|
bindView._parentView = view;
|
@@ -18268,17 +18683,13 @@ function simpleBind(property, options) {
|
|
18268
18683
|
// tells the Ember._HandlebarsBoundView to re-render. If property
|
18269
18684
|
// is an empty string, we are printing the current context
|
18270
18685
|
// object ({{this}}) so updating it is not our responsibility.
|
18271
|
-
if (path !== '') {
|
18272
|
-
|
18273
|
-
|
18274
|
-
view.one('willClearRender', function() {
|
18275
|
-
Ember.removeObserver(pathRoot, path, observer);
|
18276
|
-
});
|
18686
|
+
if (normalized.path !== '') {
|
18687
|
+
view.registerObserver(normalized.root, normalized.path, observer);
|
18277
18688
|
}
|
18278
18689
|
} else {
|
18279
18690
|
// The object is not observable, so just render it out and
|
18280
18691
|
// be done with it.
|
18281
|
-
data.buffer.push(handlebarsGet(
|
18692
|
+
data.buffer.push(handlebarsGet(currentContext, property, options));
|
18282
18693
|
}
|
18283
18694
|
}
|
18284
18695
|
|
@@ -18367,14 +18778,17 @@ EmberHandlebars.registerHelper('bind', function(property, options) {
|
|
18367
18778
|
EmberHandlebars.registerHelper('boundIf', function(property, fn) {
|
18368
18779
|
var context = (fn.contexts && fn.contexts[0]) || this;
|
18369
18780
|
var func = function(result) {
|
18370
|
-
|
18781
|
+
var truthy = result && get(result, 'isTruthy');
|
18782
|
+
if (typeof truthy === 'boolean') { return truthy; }
|
18783
|
+
|
18784
|
+
if (Ember.isArray(result)) {
|
18371
18785
|
return get(result, 'length') !== 0;
|
18372
18786
|
} else {
|
18373
18787
|
return !!result;
|
18374
18788
|
}
|
18375
18789
|
};
|
18376
18790
|
|
18377
|
-
return bind.call(context, property, fn, true, func, func);
|
18791
|
+
return bind.call(context, property, fn, true, func, func, ['isTruthy', 'length']);
|
18378
18792
|
});
|
18379
18793
|
|
18380
18794
|
/**
|
@@ -18611,16 +19025,13 @@ EmberHandlebars.registerHelper('bindAttr', function(options) {
|
|
18611
19025
|
// current value of the property as an attribute.
|
18612
19026
|
forEach.call(attrKeys, function(attr) {
|
18613
19027
|
var path = attrs[attr],
|
18614
|
-
|
19028
|
+
normalized;
|
18615
19029
|
|
18616
19030
|
Ember.assert(fmt("You must provide a String for a bound attribute, not %@", [path]), typeof path === 'string');
|
18617
19031
|
|
18618
19032
|
normalized = normalizePath(ctx, path, options.data);
|
18619
19033
|
|
18620
|
-
|
18621
|
-
path = normalized.path;
|
18622
|
-
|
18623
|
-
var value = (path === 'this') ? pathRoot : handlebarsGet(pathRoot, path, options),
|
19034
|
+
var value = (path === 'this') ? normalized.root : handlebarsGet(ctx, path, options),
|
18624
19035
|
type = Ember.typeOf(value);
|
18625
19036
|
|
18626
19037
|
Ember.assert(fmt("Attributes must be numbers, strings or booleans, not %@", [value]), value === null || value === undefined || type === 'number' || type === 'string' || type === 'boolean');
|
@@ -18628,7 +19039,7 @@ EmberHandlebars.registerHelper('bindAttr', function(options) {
|
|
18628
19039
|
var observer, invoker;
|
18629
19040
|
|
18630
19041
|
observer = function observer() {
|
18631
|
-
var result = handlebarsGet(
|
19042
|
+
var result = handlebarsGet(ctx, path, options);
|
18632
19043
|
|
18633
19044
|
Ember.assert(fmt("Attributes must be numbers, strings or booleans, not %@", [result]), result === null || result === undefined || typeof result === 'number' || typeof result === 'string' || typeof result === 'boolean');
|
18634
19045
|
|
@@ -18639,7 +19050,7 @@ EmberHandlebars.registerHelper('bindAttr', function(options) {
|
|
18639
19050
|
// In that case, we can assume the template has been re-rendered
|
18640
19051
|
// and we need to clean up the observer.
|
18641
19052
|
if (!elem || elem.length === 0) {
|
18642
|
-
Ember.removeObserver(
|
19053
|
+
Ember.removeObserver(normalized.root, normalized.path, invoker);
|
18643
19054
|
return;
|
18644
19055
|
}
|
18645
19056
|
|
@@ -18654,11 +19065,7 @@ EmberHandlebars.registerHelper('bindAttr', function(options) {
|
|
18654
19065
|
// When the observer fires, find the element using the
|
18655
19066
|
// unique data id and update the attribute to the new value.
|
18656
19067
|
if (path !== 'this') {
|
18657
|
-
|
18658
|
-
|
18659
|
-
view.one('willClearRender', function() {
|
18660
|
-
Ember.removeObserver(pathRoot, path, invoker);
|
18661
|
-
});
|
19068
|
+
view.registerObserver(normalized.root, normalized.path, invoker);
|
18662
19069
|
}
|
18663
19070
|
|
18664
19071
|
// if this changes, also change the logic in ember-views/lib/views/view.js
|
@@ -18748,7 +19155,7 @@ EmberHandlebars.bindClasses = function(context, classBindings, view, bindAttrId,
|
|
18748
19155
|
// class name.
|
18749
19156
|
observer = function() {
|
18750
19157
|
// Get the current value of the property
|
18751
|
-
newClass = classStringForPath(
|
19158
|
+
newClass = classStringForPath(context, parsedPath, options);
|
18752
19159
|
elem = bindAttrId ? view.$("[data-bindattr-" + bindAttrId + "='" + bindAttrId + "']") : view.$();
|
18753
19160
|
|
18754
19161
|
// If we can't find the element anymore, a parent template has been
|
@@ -18777,16 +19184,12 @@ EmberHandlebars.bindClasses = function(context, classBindings, view, bindAttrId,
|
|
18777
19184
|
};
|
18778
19185
|
|
18779
19186
|
if (path !== '' && path !== 'this') {
|
18780
|
-
|
18781
|
-
|
18782
|
-
view.one('willClearRender', function() {
|
18783
|
-
Ember.removeObserver(pathRoot, path, invoker);
|
18784
|
-
});
|
19187
|
+
view.registerObserver(pathRoot, path, invoker);
|
18785
19188
|
}
|
18786
19189
|
|
18787
19190
|
// We've already setup the observer; now we just need to figure out the
|
18788
19191
|
// correct behavior right now on the first pass through.
|
18789
|
-
value = classStringForPath(
|
19192
|
+
value = classStringForPath(context, parsedPath, options);
|
18790
19193
|
|
18791
19194
|
if (value) {
|
18792
19195
|
ret.push(value);
|
@@ -19307,7 +19710,7 @@ Ember.Handlebars.registerHelper('collection', function(path, options) {
|
|
19307
19710
|
if (hash.hasOwnProperty(prop)) {
|
19308
19711
|
match = prop.match(/^item(.)(.*)$/);
|
19309
19712
|
|
19310
|
-
if(match) {
|
19713
|
+
if(match && prop !== 'itemController') {
|
19311
19714
|
// Convert itemShouldFoo -> shouldFoo
|
19312
19715
|
itemHash[match[1].toLowerCase() + match[2]] = hash[prop];
|
19313
19716
|
// Delete from hash as this will end up getting passed to the
|
@@ -19334,13 +19737,10 @@ Ember.Handlebars.registerHelper('collection', function(path, options) {
|
|
19334
19737
|
} else if (hash.emptyViewClass) {
|
19335
19738
|
emptyViewClass = handlebarsGet(this, hash.emptyViewClass, options);
|
19336
19739
|
}
|
19337
|
-
hash.emptyView = emptyViewClass;
|
19740
|
+
if (emptyViewClass) { hash.emptyView = emptyViewClass; }
|
19338
19741
|
|
19339
|
-
if
|
19340
|
-
itemHash._context = Ember.computed(
|
19341
|
-
return get(this, 'content');
|
19342
|
-
}).property('content');
|
19343
|
-
delete hash.eachHelper;
|
19742
|
+
if(!hash.keyword){
|
19743
|
+
itemHash._context = Ember.computed.alias('content');
|
19344
19744
|
}
|
19345
19745
|
|
19346
19746
|
var viewString = view.toString();
|
@@ -19373,13 +19773,31 @@ var handlebarsGet = Ember.Handlebars.get;
|
|
19373
19773
|
<div>{{unbound somePropertyThatDoesntChange}}</div>
|
19374
19774
|
```
|
19375
19775
|
|
19776
|
+
`unbound` can also be used in conjunction with a bound helper to
|
19777
|
+
render it in its unbound form:
|
19778
|
+
|
19779
|
+
```handlebars
|
19780
|
+
<div>{{unbound helperName somePropertyThatDoesntChange}}</div>
|
19781
|
+
```
|
19782
|
+
|
19376
19783
|
@method unbound
|
19377
19784
|
@for Ember.Handlebars.helpers
|
19378
19785
|
@param {String} property
|
19379
19786
|
@return {String} HTML string
|
19380
19787
|
*/
|
19381
19788
|
Ember.Handlebars.registerHelper('unbound', function(property, fn) {
|
19382
|
-
var
|
19789
|
+
var options = arguments[arguments.length - 1], helper, context, out;
|
19790
|
+
|
19791
|
+
if(arguments.length > 2) {
|
19792
|
+
// Unbound helper call.
|
19793
|
+
options.data.isUnbound = true;
|
19794
|
+
helper = Ember.Handlebars.helpers[arguments[0]] || Ember.Handlebars.helperMissing;
|
19795
|
+
out = helper.apply(this, Array.prototype.slice.call(arguments, 1));
|
19796
|
+
delete options.data.isUnbound;
|
19797
|
+
return out;
|
19798
|
+
}
|
19799
|
+
|
19800
|
+
context = (fn.contexts && fn.contexts[0]) || this;
|
19383
19801
|
return handlebarsGet(context, property, fn);
|
19384
19802
|
});
|
19385
19803
|
|
@@ -19445,6 +19863,44 @@ Ember.Handlebars.registerHelper('debugger', function() {
|
|
19445
19863
|
var get = Ember.get, set = Ember.set;
|
19446
19864
|
|
19447
19865
|
Ember.Handlebars.EachView = Ember.CollectionView.extend(Ember._Metamorph, {
|
19866
|
+
init: function() {
|
19867
|
+
var itemController = get(this, 'itemController');
|
19868
|
+
var binding;
|
19869
|
+
|
19870
|
+
if (itemController) {
|
19871
|
+
var controller = Ember.ArrayController.create();
|
19872
|
+
set(controller, 'itemController', itemController);
|
19873
|
+
set(controller, 'container', get(this, 'controller.container'));
|
19874
|
+
set(controller, '_eachView', this);
|
19875
|
+
set(controller, 'target', get(this, 'controller'));
|
19876
|
+
|
19877
|
+
this.disableContentObservers(function() {
|
19878
|
+
set(this, 'content', controller);
|
19879
|
+
binding = new Ember.Binding('content', '_eachView.dataSource').oneWay();
|
19880
|
+
binding.connect(controller);
|
19881
|
+
});
|
19882
|
+
|
19883
|
+
set(this, '_arrayController', controller);
|
19884
|
+
} else {
|
19885
|
+
this.disableContentObservers(function() {
|
19886
|
+
binding = new Ember.Binding('content', 'dataSource').oneWay();
|
19887
|
+
binding.connect(this);
|
19888
|
+
});
|
19889
|
+
}
|
19890
|
+
|
19891
|
+
return this._super();
|
19892
|
+
},
|
19893
|
+
|
19894
|
+
disableContentObservers: function(callback) {
|
19895
|
+
Ember.removeBeforeObserver(this, 'content', null, '_contentWillChange');
|
19896
|
+
Ember.removeObserver(this, 'content', null, '_contentDidChange');
|
19897
|
+
|
19898
|
+
callback.apply(this);
|
19899
|
+
|
19900
|
+
Ember.addBeforeObserver(this, 'content', null, '_contentWillChange');
|
19901
|
+
Ember.addObserver(this, 'content', null, '_contentDidChange');
|
19902
|
+
},
|
19903
|
+
|
19448
19904
|
itemViewClass: Ember._MetamorphView,
|
19449
19905
|
emptyViewClass: Ember._MetamorphView,
|
19450
19906
|
|
@@ -19455,6 +19911,7 @@ Ember.Handlebars.EachView = Ember.CollectionView.extend(Ember._Metamorph, {
|
|
19455
19911
|
// to insert keywords, it is responsible for cloning
|
19456
19912
|
// the keywords hash. This will be fixed momentarily.
|
19457
19913
|
var keyword = get(this, 'keyword');
|
19914
|
+
var content = get(view, 'content');
|
19458
19915
|
|
19459
19916
|
if (keyword) {
|
19460
19917
|
var data = get(view, 'templateData');
|
@@ -19463,14 +19920,28 @@ Ember.Handlebars.EachView = Ember.CollectionView.extend(Ember._Metamorph, {
|
|
19463
19920
|
data.keywords = view.cloneKeywords();
|
19464
19921
|
set(view, 'templateData', data);
|
19465
19922
|
|
19466
|
-
var content = get(view, 'content');
|
19467
|
-
|
19468
19923
|
// In this case, we do not bind, because the `content` of
|
19469
19924
|
// a #each item cannot change.
|
19470
19925
|
data.keywords[keyword] = content;
|
19471
19926
|
}
|
19472
19927
|
|
19928
|
+
// If {{#each}} is looping over an array of controllers,
|
19929
|
+
// point each child view at their respective controller.
|
19930
|
+
if (content && get(content, 'isController')) {
|
19931
|
+
set(view, 'controller', content);
|
19932
|
+
}
|
19933
|
+
|
19473
19934
|
return view;
|
19935
|
+
},
|
19936
|
+
|
19937
|
+
willDestroy: function() {
|
19938
|
+
var arrayController = get(this, '_arrayController');
|
19939
|
+
|
19940
|
+
if (arrayController) {
|
19941
|
+
arrayController.destroy();
|
19942
|
+
}
|
19943
|
+
|
19944
|
+
return this._super();
|
19474
19945
|
}
|
19475
19946
|
});
|
19476
19947
|
|
@@ -19564,7 +20035,8 @@ GroupedEach.prototype = {
|
|
19564
20035
|
|
19565
20036
|
/**
|
19566
20037
|
The `{{#each}}` helper loops over elements in a collection, rendering its
|
19567
|
-
block once for each item
|
20038
|
+
block once for each item. It is an extension of the base Handlebars `{{#each}}`
|
20039
|
+
helper:
|
19568
20040
|
|
19569
20041
|
```javascript
|
19570
20042
|
Developers = [{name: 'Yehuda'},{name: 'Tom'}, {name: 'Paul'}];
|
@@ -19596,12 +20068,20 @@ GroupedEach.prototype = {
|
|
19596
20068
|
{{this}}
|
19597
20069
|
{{/each}}
|
19598
20070
|
```
|
20071
|
+
### {{else}} condition
|
20072
|
+
`{{#each}}` can have a matching `{{else}}`. The contents of this block will render
|
20073
|
+
if the collection is empty.
|
19599
20074
|
|
19600
|
-
|
19601
|
-
|
19602
|
-
|
19603
|
-
|
19604
|
-
|
20075
|
+
```
|
20076
|
+
{{#each person in Developers}}
|
20077
|
+
{{person.name}}
|
20078
|
+
{{else}}
|
20079
|
+
<p>Sorry, nobody is available for this task.</p>
|
20080
|
+
{{/each}}
|
20081
|
+
```
|
20082
|
+
### Specifying a View class for items
|
20083
|
+
If you provide an `itemViewClass` option that references a view class
|
20084
|
+
with its own `template` you can omit the block.
|
19605
20085
|
|
19606
20086
|
The following template:
|
19607
20087
|
|
@@ -19627,8 +20107,6 @@ GroupedEach.prototype = {
|
|
19627
20107
|
App.AnItemView = Ember.View.extend({
|
19628
20108
|
template: Ember.Handlebars.compile("Greetings {{name}}")
|
19629
20109
|
});
|
19630
|
-
|
19631
|
-
App.initialize();
|
19632
20110
|
```
|
19633
20111
|
|
19634
20112
|
Will result in the HTML structure below
|
@@ -19640,11 +20118,39 @@ GroupedEach.prototype = {
|
|
19640
20118
|
<div class="ember-view">Greetings Sara</div>
|
19641
20119
|
</div>
|
19642
20120
|
```
|
19643
|
-
|
20121
|
+
|
20122
|
+
### Representing each item with a Controller.
|
20123
|
+
By default the controller lookup within an `{{#each}}` block will be
|
20124
|
+
the controller of the template where the `{{#each}}` was used. If each
|
20125
|
+
item needs to be presented by a custom controller you can provide a
|
20126
|
+
`itemController` option which references a controller by lookup name.
|
20127
|
+
Each item in the loop will be wrapped in an instance of this controller
|
20128
|
+
and the item itself will be set to the `content` property of that controller.
|
20129
|
+
|
20130
|
+
This is useful in cases where properties of model objects need transformation
|
20131
|
+
or synthesis for display:
|
20132
|
+
|
20133
|
+
```javascript
|
20134
|
+
App.DeveloperController = Ember.ObjectController.extend({
|
20135
|
+
isAvailableForHire: function(){
|
20136
|
+
return !this.get('content.isEmployed') && this.get('content.isSeekingWork');
|
20137
|
+
}.property('isEmployed', 'isSeekingWork')
|
20138
|
+
})
|
20139
|
+
```
|
20140
|
+
|
20141
|
+
```handlebars
|
20142
|
+
{{#each person in Developers itemController="developer"}}
|
20143
|
+
{{person.name}} {{#if person.isAvailableForHire}}Hire me!{{/if}}
|
20144
|
+
{{/each}}
|
20145
|
+
```
|
20146
|
+
|
19644
20147
|
@method each
|
19645
20148
|
@for Ember.Handlebars.helpers
|
19646
20149
|
@param [name] {String} name for item (used with `in`)
|
19647
20150
|
@param path {String} path
|
20151
|
+
@param [options] {Object} Handlebars key/value pairs of options
|
20152
|
+
@param [options.itemViewClass] {String} a path to a view class used for each item
|
20153
|
+
@param [options.itemController] {String} name of a controller to be created for each item
|
19648
20154
|
*/
|
19649
20155
|
Ember.Handlebars.registerHelper('each', function(path, options) {
|
19650
20156
|
if (arguments.length === 4) {
|
@@ -19657,11 +20163,9 @@ Ember.Handlebars.registerHelper('each', function(path, options) {
|
|
19657
20163
|
if (path === '') { path = "this"; }
|
19658
20164
|
|
19659
20165
|
options.hash.keyword = keywordName;
|
19660
|
-
} else {
|
19661
|
-
options.hash.eachHelper = 'each';
|
19662
20166
|
}
|
19663
20167
|
|
19664
|
-
options.hash.
|
20168
|
+
options.hash.dataSourceBinding = path;
|
19665
20169
|
// Set up emptyView as a metamorph with no tag
|
19666
20170
|
//options.hash.emptyViewClass = Ember._MetamorphView;
|
19667
20171
|
|
@@ -20020,7 +20524,7 @@ Ember.TextField = Ember.View.extend(Ember.TextSupport,
|
|
20020
20524
|
|
20021
20525
|
classNames: ['ember-text-field'],
|
20022
20526
|
tagName: "input",
|
20023
|
-
attributeBindings: ['type', 'value', 'size'],
|
20527
|
+
attributeBindings: ['type', 'value', 'size', 'pattern'],
|
20024
20528
|
|
20025
20529
|
/**
|
20026
20530
|
The `value` attribute of the input element. As the user inputs text, this
|
@@ -20050,6 +20554,15 @@ Ember.TextField = Ember.View.extend(Ember.TextSupport,
|
|
20050
20554
|
*/
|
20051
20555
|
size: null,
|
20052
20556
|
|
20557
|
+
/**
|
20558
|
+
The `pattern` the pattern attribute of input element.
|
20559
|
+
|
20560
|
+
@property pattern
|
20561
|
+
@type String
|
20562
|
+
@default null
|
20563
|
+
*/
|
20564
|
+
pattern: null,
|
20565
|
+
|
20053
20566
|
/**
|
20054
20567
|
The action to be sent when the user presses the return key.
|
20055
20568
|
|
@@ -20063,15 +20576,34 @@ Ember.TextField = Ember.View.extend(Ember.TextSupport,
|
|
20063
20576
|
*/
|
20064
20577
|
action: null,
|
20065
20578
|
|
20066
|
-
|
20579
|
+
/**
|
20580
|
+
Whether they `keyUp` event that triggers an `action` to be sent continues
|
20581
|
+
propagating to other views.
|
20582
|
+
|
20583
|
+
By default, when the user presses the return key on their keyboard and
|
20584
|
+
the text field has an `action` set, the action will be sent to the view's
|
20585
|
+
controller and the key event will stop propagating.
|
20586
|
+
|
20587
|
+
If you would like parent views to receive the `keyUp` event even after an
|
20588
|
+
action has been dispatched, set `bubbles` to true.
|
20589
|
+
|
20590
|
+
@property bubbles
|
20591
|
+
@type Boolean
|
20592
|
+
@default false
|
20593
|
+
*/
|
20594
|
+
bubbles: false,
|
20595
|
+
|
20596
|
+
insertNewline: function(event) {
|
20067
20597
|
var controller = get(this, 'controller'),
|
20068
20598
|
action = get(this, 'action');
|
20069
20599
|
|
20070
20600
|
if (action) {
|
20071
|
-
controller.send(action, get(this, 'value'));
|
20072
|
-
}
|
20601
|
+
controller.send(action, get(this, 'value'), this);
|
20073
20602
|
|
20074
|
-
|
20603
|
+
if (!get(this, 'bubbles')) {
|
20604
|
+
event.stopPropagation();
|
20605
|
+
}
|
20606
|
+
}
|
20075
20607
|
}
|
20076
20608
|
});
|
20077
20609
|
|
@@ -20545,30 +21077,37 @@ Ember.Select = Ember.View.extend(
|
|
20545
21077
|
tagName: 'select',
|
20546
21078
|
classNames: ['ember-select'],
|
20547
21079
|
defaultTemplate: Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) {
|
21080
|
+
this.compilerInfo = [2,'>= 1.0.0-rc.3'];
|
20548
21081
|
helpers = helpers || Ember.Handlebars.helpers; data = data || {};
|
20549
|
-
var buffer = '', stack1, escapeExpression=this.escapeExpression, self=this;
|
21082
|
+
var buffer = '', stack1, hashTypes, escapeExpression=this.escapeExpression, self=this;
|
20550
21083
|
|
20551
21084
|
function program1(depth0,data) {
|
20552
21085
|
|
20553
|
-
var buffer = '',
|
21086
|
+
var buffer = '', hashTypes;
|
20554
21087
|
data.buffer.push("<option value=\"\">");
|
20555
|
-
|
20556
|
-
data.buffer.push(escapeExpression(
|
20557
|
-
|
21088
|
+
hashTypes = {};
|
21089
|
+
data.buffer.push(escapeExpression(helpers._triageMustache.call(depth0, "view.prompt", {hash:{},contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data})));
|
21090
|
+
data.buffer.push("</option>");
|
21091
|
+
return buffer;
|
21092
|
+
}
|
20558
21093
|
|
20559
21094
|
function program3(depth0,data) {
|
20560
21095
|
|
20561
|
-
var
|
20562
|
-
|
20563
|
-
|
20564
|
-
|
20565
|
-
data
|
21096
|
+
var hashTypes;
|
21097
|
+
hashTypes = {'contentBinding': "STRING"};
|
21098
|
+
data.buffer.push(escapeExpression(helpers.view.call(depth0, "Ember.SelectOption", {hash:{
|
21099
|
+
'contentBinding': ("this")
|
21100
|
+
},contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data})));
|
21101
|
+
}
|
20566
21102
|
|
20567
|
-
|
21103
|
+
hashTypes = {};
|
21104
|
+
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});
|
20568
21105
|
if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
|
20569
|
-
|
21106
|
+
hashTypes = {};
|
21107
|
+
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});
|
20570
21108
|
if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
|
20571
21109
|
return buffer;
|
21110
|
+
|
20572
21111
|
}),
|
20573
21112
|
attributeBindings: ['multiple', 'disabled', 'tabindex'],
|
20574
21113
|
|
@@ -21904,10 +22443,16 @@ define("router",
|
|
21904
22443
|
if (handler.setup) { handler.setup(context); }
|
21905
22444
|
});
|
21906
22445
|
|
22446
|
+
var aborted = false;
|
21907
22447
|
eachHandler(partition.entered, function(handler, context) {
|
22448
|
+
if (aborted) { return; }
|
21908
22449
|
if (handler.enter) { handler.enter(); }
|
21909
22450
|
setContext(handler, context);
|
21910
|
-
if (handler.setup) {
|
22451
|
+
if (handler.setup) {
|
22452
|
+
if (false === handler.setup(context)) {
|
22453
|
+
aborted = true;
|
22454
|
+
}
|
22455
|
+
}
|
21911
22456
|
});
|
21912
22457
|
|
21913
22458
|
if (router.didTransition) {
|
@@ -22031,21 +22576,23 @@ define("router",
|
|
22031
22576
|
function trigger(router, args) {
|
22032
22577
|
var currentHandlerInfos = router.currentHandlerInfos;
|
22033
22578
|
|
22579
|
+
var name = args.shift();
|
22580
|
+
|
22034
22581
|
if (!currentHandlerInfos) {
|
22035
|
-
throw new Error("Could not trigger event. There are no active handlers");
|
22582
|
+
throw new Error("Could not trigger event '" + name + "'. There are no active handlers");
|
22036
22583
|
}
|
22037
22584
|
|
22038
|
-
var name = args.shift();
|
22039
|
-
|
22040
22585
|
for (var i=currentHandlerInfos.length-1; i>=0; i--) {
|
22041
22586
|
var handlerInfo = currentHandlerInfos[i],
|
22042
22587
|
handler = handlerInfo.handler;
|
22043
22588
|
|
22044
22589
|
if (handler.events && handler.events[name]) {
|
22045
22590
|
handler.events[name].apply(handler, args);
|
22046
|
-
|
22591
|
+
return;
|
22047
22592
|
}
|
22048
22593
|
}
|
22594
|
+
|
22595
|
+
throw new Error("Nothing handled the event '" + name + "'.");
|
22049
22596
|
}
|
22050
22597
|
|
22051
22598
|
function setContext(handler, context) {
|
@@ -22191,7 +22738,7 @@ Ember.generateController = function(container, controllerName, context) {
|
|
22191
22738
|
var Router = requireModule("router");
|
22192
22739
|
var get = Ember.get, set = Ember.set, classify = Ember.String.classify;
|
22193
22740
|
|
22194
|
-
var DefaultView = Ember.
|
22741
|
+
var DefaultView = Ember._MetamorphView;
|
22195
22742
|
function setupLocation(router) {
|
22196
22743
|
var location = get(router, 'location'),
|
22197
22744
|
rootURL = get(router, 'rootURL');
|
@@ -22207,6 +22754,14 @@ function setupLocation(router) {
|
|
22207
22754
|
}
|
22208
22755
|
}
|
22209
22756
|
|
22757
|
+
/**
|
22758
|
+
The `Ember.Router` class manages the application state and URLs. Refer to
|
22759
|
+
the [routing guide](http://emberjs.com/guides/routing/) for documentation.
|
22760
|
+
|
22761
|
+
@class Router
|
22762
|
+
@namespace Ember
|
22763
|
+
@extends Ember.Object
|
22764
|
+
*/
|
22210
22765
|
Ember.Router = Ember.Object.extend({
|
22211
22766
|
location: 'hash',
|
22212
22767
|
|
@@ -22216,6 +22771,10 @@ Ember.Router = Ember.Object.extend({
|
|
22216
22771
|
setupLocation(this);
|
22217
22772
|
},
|
22218
22773
|
|
22774
|
+
url: Ember.computed(function() {
|
22775
|
+
return get(this, 'location').getURL();
|
22776
|
+
}),
|
22777
|
+
|
22219
22778
|
startRouting: function() {
|
22220
22779
|
this.router = this.router || this.constructor.map(Ember.K);
|
22221
22780
|
|
@@ -22229,15 +22788,18 @@ Ember.Router = Ember.Object.extend({
|
|
22229
22788
|
container.register('view', 'default', DefaultView);
|
22230
22789
|
container.register('view', 'toplevel', Ember.View.extend());
|
22231
22790
|
|
22232
|
-
router.handleURL(location.getURL());
|
22233
22791
|
location.onUpdateURL(function(url) {
|
22234
|
-
|
22792
|
+
self.handleURL(url);
|
22235
22793
|
});
|
22794
|
+
|
22795
|
+
this.handleURL(location.getURL());
|
22236
22796
|
},
|
22237
22797
|
|
22238
22798
|
didTransition: function(infos) {
|
22239
22799
|
// Don't do any further action here if we redirected
|
22240
|
-
|
22800
|
+
for (var i=0, l=infos.length; i<l; i++) {
|
22801
|
+
if (infos[i].handler.redirected) { return; }
|
22802
|
+
}
|
22241
22803
|
|
22242
22804
|
var appController = this.container.lookup('controller:application'),
|
22243
22805
|
path = routePath(infos);
|
@@ -22255,24 +22817,14 @@ Ember.Router = Ember.Object.extend({
|
|
22255
22817
|
this.notifyPropertyChange('url');
|
22256
22818
|
},
|
22257
22819
|
|
22258
|
-
transitionTo: function(
|
22259
|
-
var args = [].slice.call(arguments)
|
22260
|
-
|
22261
|
-
if (!this.router.hasRoute(passedName)) {
|
22262
|
-
name = args[0] = passedName + '.index';
|
22263
|
-
} else {
|
22264
|
-
name = passedName;
|
22265
|
-
}
|
22266
|
-
|
22267
|
-
Ember.assert("The route " + passedName + " was not found", this.router.hasRoute(name));
|
22268
|
-
|
22269
|
-
this.router.transitionTo.apply(this.router, args);
|
22270
|
-
this.notifyPropertyChange('url');
|
22820
|
+
transitionTo: function(name) {
|
22821
|
+
var args = [].slice.call(arguments);
|
22822
|
+
doTransition(this, 'transitionTo', args);
|
22271
22823
|
},
|
22272
22824
|
|
22273
22825
|
replaceWith: function() {
|
22274
|
-
|
22275
|
-
this
|
22826
|
+
var args = [].slice.call(arguments);
|
22827
|
+
doTransition(this, 'replaceWith', args);
|
22276
22828
|
},
|
22277
22829
|
|
22278
22830
|
generate: function() {
|
@@ -22286,11 +22838,7 @@ Ember.Router = Ember.Object.extend({
|
|
22286
22838
|
},
|
22287
22839
|
|
22288
22840
|
send: function(name, context) {
|
22289
|
-
|
22290
|
-
context = context.context;
|
22291
|
-
}
|
22292
|
-
|
22293
|
-
this.router.trigger(name, context);
|
22841
|
+
this.router.trigger.apply(this.router, arguments);
|
22294
22842
|
},
|
22295
22843
|
|
22296
22844
|
hasRoute: function(route) {
|
@@ -22407,6 +22955,21 @@ function setupRouter(emberRouter, router, location) {
|
|
22407
22955
|
};
|
22408
22956
|
}
|
22409
22957
|
|
22958
|
+
function doTransition(router, method, args) {
|
22959
|
+
var passedName = args[0], name;
|
22960
|
+
|
22961
|
+
if (!router.router.hasRoute(args[0])) {
|
22962
|
+
name = args[0] = passedName + '.index';
|
22963
|
+
} else {
|
22964
|
+
name = passedName;
|
22965
|
+
}
|
22966
|
+
|
22967
|
+
Ember.assert("The route " + passedName + " was not found", router.router.hasRoute(name));
|
22968
|
+
|
22969
|
+
router.router[method].apply(router.router, args);
|
22970
|
+
router.notifyPropertyChange('url');
|
22971
|
+
}
|
22972
|
+
|
22410
22973
|
Ember.Router.reopenClass({
|
22411
22974
|
map: function(callback) {
|
22412
22975
|
var router = this.router = new Router();
|
@@ -22436,12 +22999,70 @@ var get = Ember.get, set = Ember.set,
|
|
22436
22999
|
classify = Ember.String.classify,
|
22437
23000
|
decamelize = Ember.String.decamelize;
|
22438
23001
|
|
23002
|
+
/**
|
23003
|
+
The `Ember.Route` class is used to define individual routes. Refer to
|
23004
|
+
the [routing guide](http://emberjs.com/guides/routing/) for documentation.
|
22439
23005
|
|
23006
|
+
@class Route
|
23007
|
+
@namespace Ember
|
23008
|
+
@extends Ember.Object
|
23009
|
+
*/
|
22440
23010
|
Ember.Route = Ember.Object.extend({
|
23011
|
+
/**
|
23012
|
+
@private
|
23013
|
+
|
23014
|
+
@method exit
|
23015
|
+
*/
|
22441
23016
|
exit: function() {
|
23017
|
+
this.deactivate();
|
22442
23018
|
teardownView(this);
|
22443
23019
|
},
|
22444
23020
|
|
23021
|
+
/**
|
23022
|
+
@private
|
23023
|
+
|
23024
|
+
@method enter
|
23025
|
+
*/
|
23026
|
+
enter: function() {
|
23027
|
+
this.activate();
|
23028
|
+
},
|
23029
|
+
|
23030
|
+
/**
|
23031
|
+
The collection of functions keyed by name available on this route as
|
23032
|
+
action targets.
|
23033
|
+
|
23034
|
+
These functions will be invoked when a matching `{{action}}` is triggered
|
23035
|
+
from within a template and the application's current route is this route.
|
23036
|
+
|
23037
|
+
Events can also be invoked from other parts of your application via `Route#send`.
|
23038
|
+
|
23039
|
+
The context of event will be the this route.
|
23040
|
+
|
23041
|
+
@see {Ember.Route#send}
|
23042
|
+
@see {Handlebars.helpers.action}
|
23043
|
+
|
23044
|
+
@property events
|
23045
|
+
@type Hash
|
23046
|
+
@default null
|
23047
|
+
*/
|
23048
|
+
events: null,
|
23049
|
+
|
23050
|
+
/**
|
23051
|
+
This hook is executed when the router completely exits this route. It is
|
23052
|
+
not executed when the model for the route changes.
|
23053
|
+
|
23054
|
+
@method deactivate
|
23055
|
+
*/
|
23056
|
+
deactivate: Ember.K,
|
23057
|
+
|
23058
|
+
/**
|
23059
|
+
This hook is executed when the router enters the route for the first time.
|
23060
|
+
It is not executed when the model for the route changes.
|
23061
|
+
|
23062
|
+
@method activate
|
23063
|
+
*/
|
23064
|
+
activate: Ember.K,
|
23065
|
+
|
22445
23066
|
/**
|
22446
23067
|
Transition into another route. Optionally supply a model for the
|
22447
23068
|
route in question. The model will be serialized into the URL
|
@@ -22452,7 +23073,7 @@ Ember.Route = Ember.Object.extend({
|
|
22452
23073
|
@param {...Object} models the
|
22453
23074
|
*/
|
22454
23075
|
transitionTo: function() {
|
22455
|
-
this.
|
23076
|
+
if (this._checkingRedirect) { this.redirected = true; }
|
22456
23077
|
return this.router.transitionTo.apply(this.router, arguments);
|
22457
23078
|
},
|
22458
23079
|
|
@@ -22465,7 +23086,7 @@ Ember.Route = Ember.Object.extend({
|
|
22465
23086
|
@param {...Object} models the
|
22466
23087
|
*/
|
22467
23088
|
replaceWith: function() {
|
22468
|
-
this.
|
23089
|
+
if (this._checkingRedirect) { this.redirected = true; }
|
22469
23090
|
return this.router.replaceWith.apply(this.router, arguments);
|
22470
23091
|
},
|
22471
23092
|
|
@@ -22481,14 +23102,18 @@ Ember.Route = Ember.Object.extend({
|
|
22481
23102
|
@method setup
|
22482
23103
|
*/
|
22483
23104
|
setup: function(context) {
|
22484
|
-
this.
|
23105
|
+
this.redirected = false;
|
23106
|
+
this._checkingRedirect = true;
|
23107
|
+
|
22485
23108
|
this.redirect(context);
|
22486
23109
|
|
22487
|
-
|
23110
|
+
this._checkingRedirect = false;
|
23111
|
+
if (this.redirected) { return false; }
|
22488
23112
|
|
22489
23113
|
var controller = this.controllerFor(this.routeName, context);
|
22490
23114
|
|
22491
23115
|
if (controller) {
|
23116
|
+
this.controller = controller;
|
22492
23117
|
set(controller, 'model', context);
|
22493
23118
|
}
|
22494
23119
|
|
@@ -22563,16 +23188,18 @@ Ember.Route = Ember.Object.extend({
|
|
22563
23188
|
@param {Object} params the parameters extracted from the URL
|
22564
23189
|
*/
|
22565
23190
|
model: function(params) {
|
22566
|
-
var match, name, value;
|
23191
|
+
var match, name, sawParams, value;
|
22567
23192
|
|
22568
23193
|
for (var prop in params) {
|
22569
23194
|
if (match = prop.match(/^(.*)_id$/)) {
|
22570
23195
|
name = match[1];
|
22571
23196
|
value = params[prop];
|
22572
23197
|
}
|
23198
|
+
sawParams = true;
|
22573
23199
|
}
|
22574
23200
|
|
22575
|
-
if (!name) { return; }
|
23201
|
+
if (!name && sawParams) { return params; }
|
23202
|
+
else if (!name) { return; }
|
22576
23203
|
|
22577
23204
|
var className = classify(name),
|
22578
23205
|
namespace = this.router.namespace,
|
@@ -22620,7 +23247,12 @@ Ember.Route = Ember.Object.extend({
|
|
22620
23247
|
if (params.length !== 1) { return; }
|
22621
23248
|
|
22622
23249
|
var name = params[0], object = {};
|
22623
|
-
|
23250
|
+
|
23251
|
+
if (/_id$/.test(name)) {
|
23252
|
+
object[name] = get(model, 'id');
|
23253
|
+
} else {
|
23254
|
+
object[name] = model;
|
23255
|
+
}
|
22624
23256
|
|
22625
23257
|
return object;
|
22626
23258
|
},
|
@@ -22789,12 +23421,16 @@ Ember.Route = Ember.Object.extend({
|
|
22789
23421
|
|
22790
23422
|
if (!view && !template) { return; }
|
22791
23423
|
|
22792
|
-
this.lastRenderedTemplate = name;
|
22793
|
-
|
22794
23424
|
options = normalizeOptions(this, name, template, options);
|
22795
23425
|
view = setupView(view, container, options);
|
22796
23426
|
|
23427
|
+
if (options.outlet === 'main') { this.lastRenderedTemplate = name; }
|
23428
|
+
|
22797
23429
|
appendView(this, view, options);
|
23430
|
+
},
|
23431
|
+
|
23432
|
+
willDestroy: function() {
|
23433
|
+
teardownView(this);
|
22798
23434
|
}
|
22799
23435
|
});
|
22800
23436
|
|
@@ -22810,15 +23446,17 @@ function parentRoute(route) {
|
|
22810
23446
|
}
|
22811
23447
|
}
|
22812
23448
|
|
22813
|
-
function parentTemplate(route) {
|
23449
|
+
function parentTemplate(route, isRecursive) {
|
22814
23450
|
var parent = parentRoute(route), template;
|
22815
23451
|
|
22816
23452
|
if (!parent) { return; }
|
22817
23453
|
|
23454
|
+
Ember.warn("The immediate parent route did not render into the main outlet and the default 'into' option may not be expected", !isRecursive);
|
23455
|
+
|
22818
23456
|
if (template = parent.lastRenderedTemplate) {
|
22819
23457
|
return template;
|
22820
23458
|
} else {
|
22821
|
-
return parentTemplate(parent);
|
23459
|
+
return parentTemplate(parent, true);
|
22822
23460
|
}
|
22823
23461
|
}
|
22824
23462
|
|
@@ -22829,6 +23467,8 @@ function normalizeOptions(route, name, template, options) {
|
|
22829
23467
|
options.name = name;
|
22830
23468
|
options.template = template;
|
22831
23469
|
|
23470
|
+
Ember.assert("An outlet ("+options.outlet+") was specified but this view will render at the root level.", options.outlet === 'main' || options.into);
|
23471
|
+
|
22832
23472
|
var controller = options.controller, namedController;
|
22833
23473
|
|
22834
23474
|
if (options.controller) {
|
@@ -22855,6 +23495,8 @@ function setupView(view, container, options) {
|
|
22855
23495
|
|
22856
23496
|
if (!get(view, 'templateName')) {
|
22857
23497
|
set(view, 'template', options.template);
|
23498
|
+
|
23499
|
+
set(view, '_debugTemplateName', options.name);
|
22858
23500
|
}
|
22859
23501
|
|
22860
23502
|
set(view, 'renderedName', options.name);
|
@@ -22877,7 +23519,7 @@ function appendView(route, view, options) {
|
|
22877
23519
|
}
|
22878
23520
|
|
22879
23521
|
function teardownTopLevel(view) {
|
22880
|
-
return function() { view.
|
23522
|
+
return function() { view.destroy(); };
|
22881
23523
|
}
|
22882
23524
|
|
22883
23525
|
function teardownOutlet(parentView, outlet) {
|
@@ -22902,10 +23544,15 @@ function teardownView(route) {
|
|
22902
23544
|
|
22903
23545
|
|
22904
23546
|
(function() {
|
23547
|
+
/**
|
23548
|
+
@module ember
|
23549
|
+
@submodule ember-routing
|
23550
|
+
*/
|
23551
|
+
|
22905
23552
|
var get = Ember.get, set = Ember.set;
|
22906
23553
|
Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
22907
23554
|
|
22908
|
-
var
|
23555
|
+
var resolveParams = Ember.Handlebars.resolveParams,
|
22909
23556
|
isSimpleClick = Ember.ViewUtils.isSimpleClick;
|
22910
23557
|
|
22911
23558
|
function fullRouteName(router, name) {
|
@@ -22916,8 +23563,11 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22916
23563
|
return name;
|
22917
23564
|
}
|
22918
23565
|
|
22919
|
-
function resolvedPaths(
|
22920
|
-
|
23566
|
+
function resolvedPaths(options) {
|
23567
|
+
var types = options.options.types.slice(1),
|
23568
|
+
data = options.options.data;
|
23569
|
+
|
23570
|
+
return resolveParams(options.context, options.params, { types: types, data: data });
|
22921
23571
|
}
|
22922
23572
|
|
22923
23573
|
function args(linkView, router, route) {
|
@@ -22928,7 +23578,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22928
23578
|
Ember.assert("The route " + passedRouteName + " was not found", router.hasRoute(routeName));
|
22929
23579
|
|
22930
23580
|
var ret = [ routeName ];
|
22931
|
-
return ret.concat(
|
23581
|
+
return ret.concat(resolvedPaths(linkView.parameters));
|
22932
23582
|
}
|
22933
23583
|
|
22934
23584
|
var LinkView = Ember.View.extend({
|
@@ -22941,9 +23591,15 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22941
23591
|
attributeBindings: ['href', 'title'],
|
22942
23592
|
classNameBindings: 'active',
|
22943
23593
|
|
23594
|
+
// Even though this isn't a virtual view, we want to treat it as if it is
|
23595
|
+
// so that you can access the parent with {{view.prop}}
|
23596
|
+
concreteView: Ember.computed(function() {
|
23597
|
+
return get(this, 'parentView');
|
23598
|
+
}).property('parentView').volatile(),
|
23599
|
+
|
22944
23600
|
active: Ember.computed(function() {
|
22945
23601
|
var router = this.get('router'),
|
22946
|
-
params = resolvedPaths(this),
|
23602
|
+
params = resolvedPaths(this.parameters),
|
22947
23603
|
currentWithIndex = this.currentWhen + '.index',
|
22948
23604
|
isActive = router.isActive.apply(router, [this.currentWhen].concat(params)) ||
|
22949
23605
|
router.isActive.apply(router, [currentWithIndex].concat(params));
|
@@ -22978,9 +23634,16 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22978
23634
|
|
22979
23635
|
LinkView.toString = function() { return "LinkView"; };
|
22980
23636
|
|
23637
|
+
/**
|
23638
|
+
@method linkTo
|
23639
|
+
@for Ember.Handlebars.helpers
|
23640
|
+
@param {String} routeName
|
23641
|
+
@param {Object} [context]*
|
23642
|
+
@return {String} HTML string
|
23643
|
+
*/
|
22981
23644
|
Ember.Handlebars.registerHelper('linkTo', function(name) {
|
22982
23645
|
var options = [].slice.call(arguments, -1)[0];
|
22983
|
-
var
|
23646
|
+
var params = [].slice.call(arguments, 1, -1);
|
22984
23647
|
|
22985
23648
|
var hash = options.hash;
|
22986
23649
|
|
@@ -22988,9 +23651,9 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
22988
23651
|
hash.currentWhen = hash.currentWhen || name;
|
22989
23652
|
|
22990
23653
|
hash.parameters = {
|
22991
|
-
|
22992
|
-
|
22993
|
-
|
23654
|
+
context: this,
|
23655
|
+
options: options,
|
23656
|
+
params: params
|
22994
23657
|
};
|
22995
23658
|
|
22996
23659
|
return Ember.Handlebars.helpers.view.call(this, LinkView, options);
|
@@ -23074,45 +23737,6 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23074
23737
|
|
23075
23738
|
return Handlebars.helpers.view.call(this, Handlebars.OutletView, options);
|
23076
23739
|
});
|
23077
|
-
|
23078
|
-
Ember.View.reopen({
|
23079
|
-
init: function() {
|
23080
|
-
set(this, '_outlets', {});
|
23081
|
-
this._super();
|
23082
|
-
},
|
23083
|
-
|
23084
|
-
connectOutlet: function(outletName, view) {
|
23085
|
-
var outlets = get(this, '_outlets'),
|
23086
|
-
container = get(this, 'container'),
|
23087
|
-
router = container && container.lookup('router:main'),
|
23088
|
-
oldView = get(outlets, outletName),
|
23089
|
-
renderedName = get(view, 'renderedName');
|
23090
|
-
|
23091
|
-
set(outlets, outletName, view);
|
23092
|
-
|
23093
|
-
if (router) {
|
23094
|
-
if (oldView) {
|
23095
|
-
router._disconnectActiveView(oldView);
|
23096
|
-
}
|
23097
|
-
if (renderedName) {
|
23098
|
-
router._connectActiveView(renderedName, view);
|
23099
|
-
}
|
23100
|
-
}
|
23101
|
-
},
|
23102
|
-
|
23103
|
-
disconnectOutlet: function(outletName) {
|
23104
|
-
var outlets = get(this, '_outlets'),
|
23105
|
-
container = get(this, 'container'),
|
23106
|
-
router = container && container.lookup('router:main'),
|
23107
|
-
view = get(outlets, outletName);
|
23108
|
-
|
23109
|
-
set(outlets, outletName, null);
|
23110
|
-
|
23111
|
-
if (router && view) {
|
23112
|
-
router._disconnectActiveView(view);
|
23113
|
-
}
|
23114
|
-
}
|
23115
|
-
});
|
23116
23740
|
});
|
23117
23741
|
|
23118
23742
|
})();
|
@@ -23128,17 +23752,34 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23128
23752
|
var get = Ember.get, set = Ember.set;
|
23129
23753
|
Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
23130
23754
|
|
23131
|
-
|
23755
|
+
/**
|
23756
|
+
Renders the named template in the current context using the singleton
|
23757
|
+
instance of the same-named controller.
|
23758
|
+
|
23759
|
+
If a view class with the same name exists, uses the view class.
|
23760
|
+
|
23761
|
+
If a `model` is specified, it becomes the model for that controller.
|
23762
|
+
|
23763
|
+
The default target for `{{action}}`s in the rendered template is the
|
23764
|
+
named controller.
|
23765
|
+
|
23766
|
+
@method action
|
23767
|
+
@for Ember.Handlebars.helpers
|
23768
|
+
@param {String} actionName
|
23769
|
+
@param {Object?} model
|
23770
|
+
@param {Hash} options
|
23771
|
+
*/
|
23772
|
+
Ember.Handlebars.registerHelper('render', function(name, contextString, options) {
|
23132
23773
|
Ember.assert("You must pass a template to render", arguments.length >= 2);
|
23133
|
-
var container, router, controller, view;
|
23774
|
+
var container, router, controller, view, context;
|
23134
23775
|
|
23135
23776
|
if (arguments.length === 2) {
|
23136
|
-
options =
|
23137
|
-
|
23777
|
+
options = contextString;
|
23778
|
+
contextString = undefined;
|
23138
23779
|
}
|
23139
23780
|
|
23140
|
-
if (typeof
|
23141
|
-
context = Ember.Handlebars.get(options.contexts[1],
|
23781
|
+
if (typeof contextString === 'string') {
|
23782
|
+
context = Ember.Handlebars.get(options.contexts[1], contextString, options);
|
23142
23783
|
}
|
23143
23784
|
|
23144
23785
|
name = name.replace(/\//g, '.');
|
@@ -23159,6 +23800,14 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23159
23800
|
controller.set('model', context);
|
23160
23801
|
}
|
23161
23802
|
|
23803
|
+
var root = options.contexts[1];
|
23804
|
+
|
23805
|
+
if (root) {
|
23806
|
+
view.registerObserver(root, contextString, function() {
|
23807
|
+
controller.set('model', Ember.Handlebars.get(root, contextString, options));
|
23808
|
+
});
|
23809
|
+
}
|
23810
|
+
|
23162
23811
|
controller.set('target', options.data.keywords.controller);
|
23163
23812
|
|
23164
23813
|
options.hash.viewName = Ember.String.camelize(name);
|
@@ -23185,7 +23834,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23185
23834
|
*/
|
23186
23835
|
Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
23187
23836
|
|
23188
|
-
var
|
23837
|
+
var resolveParams = Ember.Handlebars.resolveParams,
|
23189
23838
|
isSimpleClick = Ember.ViewUtils.isSimpleClick;
|
23190
23839
|
|
23191
23840
|
var EmberHandlebars = Ember.Handlebars,
|
@@ -23197,7 +23846,11 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23197
23846
|
function args(options, actionName) {
|
23198
23847
|
var ret = [];
|
23199
23848
|
if (actionName) { ret.push(actionName); }
|
23200
|
-
|
23849
|
+
|
23850
|
+
var types = options.options.types.slice(1),
|
23851
|
+
data = options.options.data;
|
23852
|
+
|
23853
|
+
return ret.concat(resolveParams(options.context, options.params, { types: types, data: data }));
|
23201
23854
|
}
|
23202
23855
|
|
23203
23856
|
var ActionHelper = EmberHandlebars.ActionHelper = {
|
@@ -23221,12 +23874,20 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23221
23874
|
contexts = options.contexts,
|
23222
23875
|
target = options.target;
|
23223
23876
|
|
23224
|
-
if (target.
|
23225
|
-
|
23877
|
+
if (target.target) {
|
23878
|
+
target = handlebarsGet(target.root, target.target, target.options);
|
23226
23879
|
} else {
|
23227
|
-
|
23228
|
-
return target[actionName].apply(target, args(options));
|
23880
|
+
target = target.root;
|
23229
23881
|
}
|
23882
|
+
|
23883
|
+
Ember.run(function() {
|
23884
|
+
if (target.send) {
|
23885
|
+
target.send.apply(target, args(options.parameters, actionName));
|
23886
|
+
} else {
|
23887
|
+
Ember.assert("The action '" + actionName + "' did not exist on " + target, typeof target[actionName] === 'function');
|
23888
|
+
target[actionName].apply(target, args(options.parameters));
|
23889
|
+
}
|
23890
|
+
});
|
23230
23891
|
}
|
23231
23892
|
};
|
23232
23893
|
|
@@ -23406,7 +24067,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23406
24067
|
@method action
|
23407
24068
|
@for Ember.Handlebars.helpers
|
23408
24069
|
@param {String} actionName
|
23409
|
-
@param {Object
|
24070
|
+
@param {Object} [context]*
|
23410
24071
|
@param {Hash} options
|
23411
24072
|
*/
|
23412
24073
|
EmberHandlebars.registerHelper('action', function(actionName) {
|
@@ -23415,7 +24076,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23415
24076
|
|
23416
24077
|
var hash = options.hash,
|
23417
24078
|
view = options.data.view,
|
23418
|
-
|
24079
|
+
controller, link;
|
23419
24080
|
|
23420
24081
|
// create a hash to pass along to registerAction
|
23421
24082
|
var action = {
|
@@ -23423,20 +24084,23 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23423
24084
|
};
|
23424
24085
|
|
23425
24086
|
action.parameters = {
|
23426
|
-
|
23427
|
-
|
23428
|
-
|
24087
|
+
context: this,
|
24088
|
+
options: options,
|
24089
|
+
params: contexts
|
23429
24090
|
};
|
23430
24091
|
|
23431
24092
|
action.view = view = get(view, 'concreteView');
|
23432
24093
|
|
24094
|
+
var root, target;
|
24095
|
+
|
23433
24096
|
if (hash.target) {
|
23434
|
-
|
24097
|
+
root = this;
|
24098
|
+
target = hash.target;
|
23435
24099
|
} else if (controller = options.data.keywords.controller) {
|
23436
|
-
|
24100
|
+
root = controller;
|
23437
24101
|
}
|
23438
24102
|
|
23439
|
-
action.target = target;
|
24103
|
+
action.target = { root: root, target: target, options: options };
|
23440
24104
|
action.bubbles = hash.bubbles;
|
23441
24105
|
|
23442
24106
|
var actionId = ActionHelper.registerAction(actionName, action);
|
@@ -23449,6 +24113,86 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23449
24113
|
|
23450
24114
|
|
23451
24115
|
|
24116
|
+
(function() {
|
24117
|
+
/**
|
24118
|
+
@module ember
|
24119
|
+
@submodule ember-routing
|
24120
|
+
*/
|
24121
|
+
|
24122
|
+
if (Ember.ENV.EXPERIMENTAL_CONTROL_HELPER) {
|
24123
|
+
var get = Ember.get, set = Ember.set;
|
24124
|
+
|
24125
|
+
/**
|
24126
|
+
The control helper is currently under development and is considered experimental.
|
24127
|
+
To enable it, set `ENV.EXPERIMENTAL_CONTROL_HELPER = true` before requiring Ember.
|
24128
|
+
|
24129
|
+
@method control
|
24130
|
+
@for Ember.Handlebars.helpers
|
24131
|
+
@param {String} path
|
24132
|
+
@param {String} modelPath
|
24133
|
+
@param {Hash} options
|
24134
|
+
@return {String} HTML string
|
24135
|
+
*/
|
24136
|
+
Ember.Handlebars.registerHelper('control', function(path, modelPath, options) {
|
24137
|
+
if (arguments.length === 2) {
|
24138
|
+
options = modelPath;
|
24139
|
+
modelPath = undefined;
|
24140
|
+
}
|
24141
|
+
|
24142
|
+
var model;
|
24143
|
+
|
24144
|
+
if (modelPath) {
|
24145
|
+
model = Ember.Handlebars.get(this, modelPath, options);
|
24146
|
+
}
|
24147
|
+
|
24148
|
+
var controller = options.data.keywords.controller,
|
24149
|
+
view = options.data.keywords.view,
|
24150
|
+
children = get(controller, '_childContainers'),
|
24151
|
+
controlID = options.hash.controlID,
|
24152
|
+
container, subContainer;
|
24153
|
+
|
24154
|
+
if (children.hasOwnProperty(controlID)) {
|
24155
|
+
subContainer = children[controlID];
|
24156
|
+
} else {
|
24157
|
+
container = get(controller, 'container'),
|
24158
|
+
subContainer = container.child();
|
24159
|
+
children[controlID] = subContainer;
|
24160
|
+
}
|
24161
|
+
|
24162
|
+
var normalizedPath = path.replace(/\//g, '.');
|
24163
|
+
|
24164
|
+
var childView = subContainer.lookup('view:' + normalizedPath) || subContainer.lookup('view:default'),
|
24165
|
+
childController = subContainer.lookup('controller:' + normalizedPath),
|
24166
|
+
childTemplate = subContainer.lookup('template:' + path);
|
24167
|
+
|
24168
|
+
Ember.assert("Could not find controller for path: " + normalizedPath, childController);
|
24169
|
+
Ember.assert("Could not find view for path: " + normalizedPath, childView);
|
24170
|
+
|
24171
|
+
set(childController, 'target', controller);
|
24172
|
+
set(childController, 'model', model);
|
24173
|
+
|
24174
|
+
options.hash.template = childTemplate;
|
24175
|
+
options.hash.controller = childController;
|
24176
|
+
|
24177
|
+
function observer() {
|
24178
|
+
var model = Ember.Handlebars.get(this, modelPath, options);
|
24179
|
+
set(childController, 'model', model);
|
24180
|
+
childView.rerender();
|
24181
|
+
}
|
24182
|
+
|
24183
|
+
Ember.addObserver(this, modelPath, observer);
|
24184
|
+
childView.one('willDestroyElement', this, function() {
|
24185
|
+
Ember.removeObserver(this, modelPath, observer);
|
24186
|
+
});
|
24187
|
+
|
24188
|
+
Ember.Handlebars.helpers.view.call(this, childView, options);
|
24189
|
+
});
|
24190
|
+
}
|
24191
|
+
|
24192
|
+
})();
|
24193
|
+
|
24194
|
+
|
24195
|
+
|
23452
24196
|
(function() {
|
23453
24197
|
|
23454
24198
|
})();
|
@@ -23462,95 +24206,32 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
|
|
23462
24206
|
*/
|
23463
24207
|
|
23464
24208
|
var get = Ember.get, set = Ember.set;
|
23465
|
-
var ControllersProxy = Ember.Object.extend({
|
23466
|
-
controller: null,
|
23467
|
-
|
23468
|
-
unknownProperty: function(controllerName) {
|
23469
|
-
var controller = get(this, 'controller'),
|
23470
|
-
needs = get(controller, 'needs'),
|
23471
|
-
dependency;
|
23472
|
-
|
23473
|
-
for (var i=0, l=needs.length; i<l; i++) {
|
23474
|
-
dependency = needs[i];
|
23475
|
-
if (dependency === controllerName) {
|
23476
|
-
return controller.controllerFor(controllerName);
|
23477
|
-
}
|
23478
|
-
}
|
23479
|
-
}
|
23480
|
-
});
|
23481
24209
|
|
23482
24210
|
Ember.ControllerMixin.reopen({
|
23483
|
-
concatenatedProperties: ['needs'],
|
23484
|
-
needs: [],
|
23485
|
-
|
23486
|
-
init: function() {
|
23487
|
-
this._super.apply(this, arguments);
|
23488
|
-
|
23489
|
-
// Structure asserts to still do verification but not string concat in production
|
23490
|
-
if(!verifyDependencies(this)) {
|
23491
|
-
Ember.assert("Missing dependencies", false);
|
23492
|
-
}
|
23493
|
-
},
|
23494
|
-
|
23495
24211
|
transitionToRoute: function() {
|
23496
|
-
|
23497
|
-
|
23498
|
-
|
24212
|
+
// target may be either another controller or a router
|
24213
|
+
var target = get(this, 'target'),
|
24214
|
+
method = target.transitionToRoute || target.transitionTo;
|
24215
|
+
return method.apply(target, arguments);
|
23499
24216
|
},
|
23500
24217
|
|
23501
|
-
// TODO: Deprecate this, see https://github.com/emberjs/ember.js/issues/1785
|
23502
24218
|
transitionTo: function() {
|
24219
|
+
Ember.deprecate("transitionTo is deprecated. Please use transitionToRoute.");
|
23503
24220
|
return this.transitionToRoute.apply(this, arguments);
|
23504
24221
|
},
|
23505
24222
|
|
23506
24223
|
replaceRoute: function() {
|
23507
|
-
|
23508
|
-
|
23509
|
-
|
24224
|
+
// target may be either another controller or a router
|
24225
|
+
var target = get(this, 'target'),
|
24226
|
+
method = target.replaceRoute || target.replaceWith;
|
24227
|
+
return method.apply(target, arguments);
|
23510
24228
|
},
|
23511
24229
|
|
23512
|
-
// TODO: Deprecate this, see https://github.com/emberjs/ember.js/issues/1785
|
23513
24230
|
replaceWith: function() {
|
24231
|
+
Ember.deprecate("replaceWith is deprecated. Please use replaceRoute.");
|
23514
24232
|
return this.replaceRoute.apply(this, arguments);
|
23515
|
-
},
|
23516
|
-
|
23517
|
-
controllerFor: function(controllerName) {
|
23518
|
-
var container = get(this, 'container');
|
23519
|
-
return container.lookup('controller:' + controllerName);
|
23520
|
-
},
|
23521
|
-
|
23522
|
-
model: Ember.computed(function(key, value) {
|
23523
|
-
if (arguments.length > 1) {
|
23524
|
-
return set(this, 'content', value);
|
23525
|
-
} else {
|
23526
|
-
return get(this, 'content');
|
23527
|
-
}
|
23528
|
-
}).property('content'),
|
23529
|
-
|
23530
|
-
controllers: Ember.computed(function() {
|
23531
|
-
return ControllersProxy.create({ controller: this });
|
23532
|
-
})
|
23533
|
-
});
|
23534
|
-
|
23535
|
-
function verifyDependencies(controller) {
|
23536
|
-
var needs = get(controller, 'needs'),
|
23537
|
-
container = get(controller, 'container'),
|
23538
|
-
dependency, satisfied = true;
|
23539
|
-
|
23540
|
-
for (var i=0, l=needs.length; i<l; i++) {
|
23541
|
-
dependency = needs[i];
|
23542
|
-
if (dependency.indexOf(':') === -1) {
|
23543
|
-
dependency = "controller:" + dependency;
|
23544
|
-
}
|
23545
|
-
|
23546
|
-
if (!container.has(dependency)) {
|
23547
|
-
satisfied = false;
|
23548
|
-
Ember.assert(controller + " needs " + dependency + " but it does not exist", false);
|
23549
|
-
}
|
23550
24233
|
}
|
23551
|
-
|
23552
|
-
return satisfied;
|
23553
|
-
}
|
24234
|
+
});
|
23554
24235
|
|
23555
24236
|
})();
|
23556
24237
|
|
@@ -23687,7 +24368,12 @@ Ember.NoneLocation = Ember.Object.extend({
|
|
23687
24368
|
},
|
23688
24369
|
|
23689
24370
|
onUpdateURL: function(callback) {
|
23690
|
-
|
24371
|
+
this.updateCallback = callback;
|
24372
|
+
},
|
24373
|
+
|
24374
|
+
handleURL: function(url) {
|
24375
|
+
set(this, 'path', url);
|
24376
|
+
this.updateCallback(url);
|
23691
24377
|
},
|
23692
24378
|
|
23693
24379
|
formatURL: function(url) {
|
@@ -23768,12 +24454,14 @@ Ember.HashLocation = Ember.Object.extend({
|
|
23768
24454
|
var guid = Ember.guidFor(this);
|
23769
24455
|
|
23770
24456
|
Ember.$(window).bind('hashchange.ember-location-'+guid, function() {
|
23771
|
-
|
23772
|
-
|
24457
|
+
Ember.run(function() {
|
24458
|
+
var path = location.hash.substr(1);
|
24459
|
+
if (get(self, 'lastSetURL') === path) { return; }
|
23773
24460
|
|
23774
|
-
|
24461
|
+
set(self, 'lastSetURL', null);
|
23775
24462
|
|
23776
|
-
|
24463
|
+
callback(location.hash.substr(1));
|
24464
|
+
});
|
23777
24465
|
});
|
23778
24466
|
},
|
23779
24467
|
|
@@ -23838,7 +24526,7 @@ Ember.HistoryLocation = Ember.Object.extend({
|
|
23838
24526
|
@method initState
|
23839
24527
|
*/
|
23840
24528
|
initState: function() {
|
23841
|
-
this.replaceState(
|
24529
|
+
this.replaceState(this.formatURL(this.getURL()));
|
23842
24530
|
set(this, 'history', window.history);
|
23843
24531
|
},
|
23844
24532
|
|
@@ -23853,12 +24541,18 @@ Ember.HistoryLocation = Ember.Object.extend({
|
|
23853
24541
|
/**
|
23854
24542
|
@private
|
23855
24543
|
|
23856
|
-
Returns the current `location.pathname
|
24544
|
+
Returns the current `location.pathname` without rootURL
|
23857
24545
|
|
23858
24546
|
@method getURL
|
23859
24547
|
*/
|
23860
24548
|
getURL: function() {
|
23861
|
-
|
24549
|
+
var rootURL = get(this, 'rootURL'),
|
24550
|
+
url = get(this, 'location').pathname;
|
24551
|
+
|
24552
|
+
rootURL = rootURL.replace(/\/$/, '');
|
24553
|
+
url = url.replace(rootURL, '');
|
24554
|
+
|
24555
|
+
return url;
|
23862
24556
|
},
|
23863
24557
|
|
23864
24558
|
/**
|
@@ -23941,13 +24635,14 @@ Ember.HistoryLocation = Ember.Object.extend({
|
|
23941
24635
|
@param callback {Function}
|
23942
24636
|
*/
|
23943
24637
|
onUpdateURL: function(callback) {
|
23944
|
-
var guid = Ember.guidFor(this)
|
24638
|
+
var guid = Ember.guidFor(this),
|
24639
|
+
self = this;
|
23945
24640
|
|
23946
24641
|
Ember.$(window).bind('popstate.ember-location-'+guid, function(e) {
|
23947
24642
|
if(!popstateReady) {
|
23948
24643
|
return;
|
23949
24644
|
}
|
23950
|
-
callback(
|
24645
|
+
callback(self.getURL());
|
23951
24646
|
});
|
23952
24647
|
},
|
23953
24648
|
|
@@ -24209,68 +24904,32 @@ var get = Ember.get, set = Ember.set,
|
|
24209
24904
|
layer, and a list of the event listeners that are setup by default, visit the
|
24210
24905
|
[Ember View Layer guide](http://emberjs.com/guides/view_layer#toc_event-delegation).
|
24211
24906
|
|
24212
|
-
###
|
24907
|
+
### Initializers
|
24213
24908
|
|
24214
|
-
|
24215
|
-
*classes*, not *instances*. When your application loads, all of the instances
|
24216
|
-
are created for you. Creating these instances is the responsibility of
|
24217
|
-
`Ember.Application`.
|
24218
|
-
|
24219
|
-
When the `Ember.Application` initializes, it will look for an `Ember.Router`
|
24220
|
-
class defined on the applications's `Router` property, like this:
|
24909
|
+
Libraries on top of Ember can register additional initializers, like so:
|
24221
24910
|
|
24222
24911
|
```javascript
|
24223
|
-
|
24224
|
-
|
24225
|
-
});
|
24226
|
-
```
|
24912
|
+
Ember.Application.initializer({
|
24913
|
+
name: "store",
|
24227
24914
|
|
24228
|
-
|
24229
|
-
|
24230
|
-
|
24231
|
-
`App.router` from the console can be useful during debugging.
|
24232
|
-
|
24233
|
-
After the router is created, the application loops through all of the
|
24234
|
-
registered _injections_ and invokes them once for each property on the
|
24235
|
-
`Ember.Application` object.
|
24236
|
-
|
24237
|
-
An injection is a function that is responsible for instantiating objects from
|
24238
|
-
classes defined on the application. By default, the only injection registered
|
24239
|
-
instantiates controllers and makes them available on the router.
|
24240
|
-
|
24241
|
-
For example, if you define a controller class:
|
24242
|
-
|
24243
|
-
```javascript
|
24244
|
-
App.MyController = Ember.Controller.extend({
|
24245
|
-
// ...
|
24915
|
+
initialize: function(container, application) {
|
24916
|
+
container.register('store', 'main', application.Store);
|
24917
|
+
}
|
24246
24918
|
});
|
24247
24919
|
```
|
24248
24920
|
|
24249
|
-
|
24250
|
-
`myController` property.
|
24921
|
+
### Routing
|
24251
24922
|
|
24252
|
-
|
24253
|
-
|
24254
|
-
|
24923
|
+
In addition to creating your application's router, `Ember.Application` is
|
24924
|
+
also responsible for telling the router when to start routing. Transitions
|
24925
|
+
between routes can be logged with the LOG_TRANSITIONS flag:
|
24255
24926
|
|
24256
24927
|
```javascript
|
24257
|
-
Ember.Application.
|
24258
|
-
|
24259
|
-
before: 'controllers',
|
24260
|
-
|
24261
|
-
injection: function(app, router, property) {
|
24262
|
-
if (property === 'Store') {
|
24263
|
-
set(router, 'store', app[property].create());
|
24264
|
-
}
|
24265
|
-
}
|
24928
|
+
window.App = Ember.Application.create({
|
24929
|
+
LOG_TRANSITIONS: true
|
24266
24930
|
});
|
24267
24931
|
```
|
24268
24932
|
|
24269
|
-
### Routing
|
24270
|
-
|
24271
|
-
In addition to creating your application's router, `Ember.Application` is
|
24272
|
-
also responsible for telling the router when to start routing.
|
24273
|
-
|
24274
24933
|
By default, the router will begin trying to translate the current URL into
|
24275
24934
|
application state once the browser emits the `DOMContentReady` event. If you
|
24276
24935
|
need to defer routing, you can call the application's `deferReadiness()`
|
@@ -24278,14 +24937,7 @@ var get = Ember.get, set = Ember.set,
|
|
24278
24937
|
|
24279
24938
|
If there is any setup required before routing begins, you can implement a
|
24280
24939
|
`ready()` method on your app that will be invoked immediately before routing
|
24281
|
-
begins
|
24282
|
-
|
24283
|
-
```javascript
|
24284
|
-
window.App = Ember.Application.create({
|
24285
|
-
ready: function() {
|
24286
|
-
this.set('router.enableLogging', true);
|
24287
|
-
}
|
24288
|
-
});
|
24940
|
+
begins.
|
24289
24941
|
|
24290
24942
|
To begin routing, you must have at a minimum a top-level controller and view.
|
24291
24943
|
You define these as `App.ApplicationController` and `App.ApplicationView`,
|
@@ -24303,8 +24955,7 @@ var get = Ember.get, set = Ember.set,
|
|
24303
24955
|
@namespace Ember
|
24304
24956
|
@extends Ember.Namespace
|
24305
24957
|
*/
|
24306
|
-
var Application = Ember.Application = Ember.Namespace.extend(
|
24307
|
-
/** @scope Ember.Application.prototype */{
|
24958
|
+
var Application = Ember.Application = Ember.Namespace.extend({
|
24308
24959
|
|
24309
24960
|
/**
|
24310
24961
|
The root DOM element of the Application. This can be specified as an
|
@@ -24383,6 +25034,12 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24383
25034
|
|
24384
25035
|
this.deferUntilDOMReady();
|
24385
25036
|
this.scheduleInitialize();
|
25037
|
+
|
25038
|
+
Ember.debug('-------------------------------');
|
25039
|
+
Ember.debug('Ember.VERSION : ' + Ember.VERSION);
|
25040
|
+
Ember.debug('Handlebars.VERSION : ' + Ember.Handlebars.VERSION);
|
25041
|
+
Ember.debug('jQuery.VERSION : ' + Ember.$().jquery);
|
25042
|
+
Ember.debug('-------------------------------');
|
24386
25043
|
},
|
24387
25044
|
|
24388
25045
|
/**
|
@@ -24514,9 +25171,52 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24514
25171
|
}
|
24515
25172
|
},
|
24516
25173
|
|
25174
|
+
/**
|
25175
|
+
registers a factory for later injection
|
25176
|
+
|
25177
|
+
Example:
|
25178
|
+
|
25179
|
+
```javascript
|
25180
|
+
App = Ember.Application.create();
|
25181
|
+
|
25182
|
+
App.Person = Ember.Object.extend({});
|
25183
|
+
App.Orange = Ember.Object.extend({});
|
25184
|
+
App.Email = Ember.Object.extend({});
|
25185
|
+
|
25186
|
+
App.register('model:user', App.Person, {singleton: false });
|
25187
|
+
App.register('fruit:favorite', App.Orange);
|
25188
|
+
App.register('communication:main', App.Email, {singleton: false});
|
25189
|
+
```
|
25190
|
+
|
25191
|
+
@method register
|
25192
|
+
@param type {String}
|
25193
|
+
@param name {String}
|
25194
|
+
@param factory {String}
|
25195
|
+
@param options {String} (optional)
|
25196
|
+
**/
|
24517
25197
|
register: function() {
|
24518
25198
|
var container = this.__container__;
|
24519
|
-
|
25199
|
+
container.register.apply(container, arguments);
|
25200
|
+
},
|
25201
|
+
/**
|
25202
|
+
defines an injection or typeInjection
|
25203
|
+
|
25204
|
+
Example:
|
25205
|
+
|
25206
|
+
```javascript
|
25207
|
+
App.inject(<full_name or type>, <property name>, <full_name>)
|
25208
|
+
App.inject('model:user', 'email', 'model:email')
|
25209
|
+
App.inject('model', 'source', 'source:main')
|
25210
|
+
```
|
25211
|
+
|
25212
|
+
@method inject
|
25213
|
+
@param factoryNameOrType {String}
|
25214
|
+
@param property {String}
|
25215
|
+
@param injectionName {String}
|
25216
|
+
**/
|
25217
|
+
inject: function(){
|
25218
|
+
var container = this.__container__;
|
25219
|
+
container.injection.apply(container, arguments);
|
24520
25220
|
},
|
24521
25221
|
|
24522
25222
|
/**
|
@@ -24524,7 +25224,7 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24524
25224
|
|
24525
25225
|
Initialize the application. This happens automatically.
|
24526
25226
|
|
24527
|
-
Run any
|
25227
|
+
Run any initializers and run the application load hook. These hooks may
|
24528
25228
|
choose to defer readiness. For example, an authentication hook might want
|
24529
25229
|
to defer readiness until the auth token has been retrieved.
|
24530
25230
|
|
@@ -24538,13 +25238,10 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24538
25238
|
// At this point, the App.Router must already be assigned
|
24539
25239
|
this.__container__.register('router', 'main', this.Router);
|
24540
25240
|
|
24541
|
-
// Run any injections and run the application load hook. These hooks may
|
24542
|
-
// choose to defer readiness. For example, an authentication hook might want
|
24543
|
-
// to defer readiness until the auth token has been retrieved.
|
24544
25241
|
this.runInitializers();
|
24545
25242
|
Ember.runLoadHooks('application', this);
|
24546
25243
|
|
24547
|
-
// At this point, any
|
25244
|
+
// At this point, any initializers or load hooks that would have wanted
|
24548
25245
|
// to defer readiness have fired. In general, advancing readiness here
|
24549
25246
|
// will proceed to didBecomeReady.
|
24550
25247
|
this.advanceReadiness();
|
@@ -24552,6 +25249,15 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24552
25249
|
return this;
|
24553
25250
|
},
|
24554
25251
|
|
25252
|
+
reset: function() {
|
25253
|
+
get(this, '__container__').destroy();
|
25254
|
+
this.buildContainer();
|
25255
|
+
|
25256
|
+
this.isInitialized = false;
|
25257
|
+
this.initialize();
|
25258
|
+
this.startRouting();
|
25259
|
+
},
|
25260
|
+
|
24555
25261
|
/**
|
24556
25262
|
@private
|
24557
25263
|
@method runInitializers
|
@@ -24639,6 +25345,12 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24639
25345
|
router.startRouting();
|
24640
25346
|
},
|
24641
25347
|
|
25348
|
+
handleURL: function(url) {
|
25349
|
+
var router = this.__container__.lookup('router:main');
|
25350
|
+
|
25351
|
+
router.handleURL(url);
|
25352
|
+
},
|
25353
|
+
|
24642
25354
|
/**
|
24643
25355
|
Called when the Application has become ready.
|
24644
25356
|
The call will be delayed until the DOM has become ready.
|
@@ -24653,7 +25365,7 @@ var Application = Ember.Application = Ember.Namespace.extend(
|
|
24653
25365
|
var eventDispatcher = get(this, 'eventDispatcher');
|
24654
25366
|
if (eventDispatcher) { eventDispatcher.destroy(); }
|
24655
25367
|
|
24656
|
-
this
|
25368
|
+
get(this, '__container__').destroy();
|
24657
25369
|
},
|
24658
25370
|
|
24659
25371
|
initializer: function(options) {
|
@@ -24702,7 +25414,7 @@ Ember.Application.reopenClass({
|
|
24702
25414
|
*/
|
24703
25415
|
buildContainer: function(namespace) {
|
24704
25416
|
var container = new Ember.Container();
|
24705
|
-
Ember.Container.defaultContainer = container;
|
25417
|
+
Ember.Container.defaultContainer = Ember.Container.defaultContainer || container;
|
24706
25418
|
|
24707
25419
|
container.set = Ember.set;
|
24708
25420
|
container.resolver = resolverFor(namespace);
|
@@ -24777,6 +25489,85 @@ Ember.runLoadHooks('Ember.Application', Ember.Application);
|
|
24777
25489
|
|
24778
25490
|
|
24779
25491
|
|
25492
|
+
(function() {
|
25493
|
+
/**
|
25494
|
+
@module ember
|
25495
|
+
@submodule ember-routing
|
25496
|
+
*/
|
25497
|
+
|
25498
|
+
var get = Ember.get, set = Ember.set;
|
25499
|
+
var ControllersProxy = Ember.Object.extend({
|
25500
|
+
controller: null,
|
25501
|
+
|
25502
|
+
unknownProperty: function(controllerName) {
|
25503
|
+
var controller = get(this, 'controller'),
|
25504
|
+
needs = get(controller, 'needs'),
|
25505
|
+
container = controller.get('container'),
|
25506
|
+
dependency;
|
25507
|
+
|
25508
|
+
for (var i=0, l=needs.length; i<l; i++) {
|
25509
|
+
dependency = needs[i];
|
25510
|
+
if (dependency === controllerName) {
|
25511
|
+
return container.lookup('controller:' + controllerName);
|
25512
|
+
}
|
25513
|
+
}
|
25514
|
+
}
|
25515
|
+
});
|
25516
|
+
|
25517
|
+
function verifyDependencies(controller) {
|
25518
|
+
var needs = get(controller, 'needs'),
|
25519
|
+
container = get(controller, 'container'),
|
25520
|
+
dependency, satisfied = true;
|
25521
|
+
|
25522
|
+
for (var i=0, l=needs.length; i<l; i++) {
|
25523
|
+
dependency = needs[i];
|
25524
|
+
if (dependency.indexOf(':') === -1) {
|
25525
|
+
dependency = "controller:" + dependency;
|
25526
|
+
}
|
25527
|
+
|
25528
|
+
if (!container.has(dependency)) {
|
25529
|
+
satisfied = false;
|
25530
|
+
Ember.assert(controller + " needs " + dependency + " but it does not exist", false);
|
25531
|
+
}
|
25532
|
+
}
|
25533
|
+
|
25534
|
+
return satisfied;
|
25535
|
+
}
|
25536
|
+
|
25537
|
+
Ember.ControllerMixin.reopen({
|
25538
|
+
concatenatedProperties: ['needs'],
|
25539
|
+
needs: [],
|
25540
|
+
|
25541
|
+
init: function() {
|
25542
|
+
this._super.apply(this, arguments);
|
25543
|
+
|
25544
|
+
// Structure asserts to still do verification but not string concat in production
|
25545
|
+
if(!verifyDependencies(this)) {
|
25546
|
+
Ember.assert("Missing dependencies", false);
|
25547
|
+
}
|
25548
|
+
},
|
25549
|
+
|
25550
|
+
controllerFor: function(controllerName) {
|
25551
|
+
Ember.deprecate("Controller#controllerFor is depcrecated, please use Controller#needs instead");
|
25552
|
+
var container = get(this, 'container');
|
25553
|
+
return container.lookup('controller:' + controllerName);
|
25554
|
+
},
|
25555
|
+
|
25556
|
+
controllers: Ember.computed(function() {
|
25557
|
+
return ControllersProxy.create({ controller: this });
|
25558
|
+
})
|
25559
|
+
});
|
25560
|
+
|
25561
|
+
})();
|
25562
|
+
|
25563
|
+
|
25564
|
+
|
25565
|
+
(function() {
|
25566
|
+
|
25567
|
+
})();
|
25568
|
+
|
25569
|
+
|
25570
|
+
|
24780
25571
|
(function() {
|
24781
25572
|
/**
|
24782
25573
|
Ember Application
|
@@ -25745,9 +26536,7 @@ Ember.StateManager = Ember.State.extend({
|
|
25745
26536
|
@property currentPath
|
25746
26537
|
@type String
|
25747
26538
|
*/
|
25748
|
-
currentPath: Ember.computed('currentState',
|
25749
|
-
return get(this, 'currentState.path');
|
25750
|
-
}),
|
26539
|
+
currentPath: Ember.computed.alias('currentState.path'),
|
25751
26540
|
|
25752
26541
|
/**
|
25753
26542
|
The name of transitionEvent that this stateManager will dispatch
|
@@ -26035,8 +26824,8 @@ Ember States
|
|
26035
26824
|
|
26036
26825
|
|
26037
26826
|
})();
|
26038
|
-
// Version: v1.0.0-
|
26039
|
-
// Last commit:
|
26827
|
+
// Version: v1.0.0-rc.1
|
26828
|
+
// Last commit: 8b061b4 (2013-02-15 12:10:22 -0800)
|
26040
26829
|
|
26041
26830
|
|
26042
26831
|
(function() {
|