ember-data-source 1.0.0.beta.14.1 → 1.0.0.beta.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/dist/ember-data-tests.js +250 -110
- data/dist/ember-data.js +1208 -543
- data/dist/ember-data.js.map +1 -1
- data/dist/ember-data.min.js +3 -3
- data/dist/ember-data.prod.js +1185 -527
- data/package.json +13 -10
- metadata +7 -7
data/dist/ember-data.js
CHANGED
@@ -47,13 +47,13 @@
|
|
47
47
|
```
|
48
48
|
|
49
49
|
The `DS.InvalidError` must be constructed with a single object whose
|
50
|
-
keys are the invalid model properties, and whose values
|
51
|
-
corresponding error messages. For example:
|
50
|
+
keys are the invalid model properties, and whose values contain
|
51
|
+
arrays of the corresponding error messages. For example:
|
52
52
|
|
53
53
|
```javascript
|
54
54
|
return new DS.InvalidError({
|
55
|
-
length: 'Must be less than 15',
|
56
|
-
name: 'Must not be blank'
|
55
|
+
length: ['Must be less than 15'],
|
56
|
+
name: ['Must not be blank']
|
57
57
|
});
|
58
58
|
```
|
59
59
|
|
@@ -263,7 +263,7 @@
|
|
263
263
|
the first parameter and the newly created record as the second parameter:
|
264
264
|
|
265
265
|
```javascript
|
266
|
-
generateIdForRecord: function(store,
|
266
|
+
generateIdForRecord: function(store, inputProperties) {
|
267
267
|
var uuid = App.generateUUIDWithStatisticallyLowOddsOfCollision();
|
268
268
|
return uuid;
|
269
269
|
}
|
@@ -271,7 +271,8 @@
|
|
271
271
|
|
272
272
|
@method generateIdForRecord
|
273
273
|
@param {DS.Store} store
|
274
|
-
@param {
|
274
|
+
@param {Object} inputProperties a hash of properties to set on the
|
275
|
+
newly created record.
|
275
276
|
@return {String|Number} id
|
276
277
|
*/
|
277
278
|
generateIdForRecord: null,
|
@@ -298,7 +299,8 @@
|
|
298
299
|
@return {Object} serialized record
|
299
300
|
*/
|
300
301
|
serialize: function(record, options) {
|
301
|
-
|
302
|
+
var snapshot = record._createSnapshot();
|
303
|
+
return ember$data$lib$system$adapter$$get(record, 'store').serializerFor(snapshot.typeKey).serialize(snapshot, options);
|
302
304
|
},
|
303
305
|
|
304
306
|
/**
|
@@ -510,9 +512,9 @@
|
|
510
512
|
fixturesForType: function(type) {
|
511
513
|
if (type.FIXTURES) {
|
512
514
|
var fixtures = Ember.A(type.FIXTURES);
|
513
|
-
return fixtures.map(function(fixture){
|
515
|
+
return fixtures.map(function(fixture) {
|
514
516
|
var fixtureIdType = typeof fixture.id;
|
515
|
-
if(fixtureIdType !== "number" && fixtureIdType !== "string"){
|
517
|
+
if (fixtureIdType !== "number" && fixtureIdType !== "string") {
|
516
518
|
throw new Error(ember$data$lib$adapters$fixture_adapter$$fmt('the id property must be defined as a number or string for fixture %@', [fixture]));
|
517
519
|
}
|
518
520
|
fixture.id = fixture.id + '';
|
@@ -541,7 +543,7 @@
|
|
541
543
|
@param {Array} fixture
|
542
544
|
*/
|
543
545
|
updateFixtures: function(type, fixture) {
|
544
|
-
if(!type.FIXTURES) {
|
546
|
+
if (!type.FIXTURES) {
|
545
547
|
type.FIXTURES = [];
|
546
548
|
}
|
547
549
|
|
@@ -556,11 +558,13 @@
|
|
556
558
|
Implement this method in order to provide json for CRUD methods
|
557
559
|
|
558
560
|
@method mockJSON
|
561
|
+
@param {DS.Store} store
|
559
562
|
@param {Subclass of DS.Model} type
|
560
563
|
@param {DS.Model} record
|
561
564
|
*/
|
562
565
|
mockJSON: function(store, type, record) {
|
563
|
-
|
566
|
+
var snapshot = record._createSnapshot();
|
567
|
+
return store.serializerFor(snapshot.typeKey).serialize(snapshot, { includeId: true });
|
564
568
|
},
|
565
569
|
|
566
570
|
/**
|
@@ -784,98 +788,78 @@
|
|
784
788
|
}
|
785
789
|
});
|
786
790
|
|
787
|
-
|
788
|
-
|
789
|
-
|
791
|
+
/*
|
792
|
+
The Map/MapWithDefault/OrderedSet code has been in flux as we try
|
793
|
+
to catch up with ES6. This is difficult as we support multiple
|
794
|
+
versions of Ember.
|
795
|
+
This file is currently here in case we have to polyfill ember's code
|
796
|
+
across a few releases. As ES6 comes to a close we should have a smaller
|
797
|
+
and smaller gap in implementations between Ember releases.
|
790
798
|
*/
|
791
|
-
var ember$data$lib$system$map$$
|
792
|
-
|
793
|
-
|
794
|
-
Ember.OrderedSet.apply(this, arguments);
|
795
|
-
}
|
796
|
-
|
797
|
-
function ember$data$lib$system$map$$Map() {
|
798
|
-
Ember.Map.apply(this, arguments);
|
799
|
-
}
|
800
|
-
|
801
|
-
function ember$data$lib$system$map$$MapWithDefault(){
|
802
|
-
Ember.MapWithDefault.apply(this, arguments);
|
803
|
-
}
|
804
|
-
|
805
|
-
var ember$data$lib$system$map$$testMap = Ember.Map.create();
|
806
|
-
ember$data$lib$system$map$$testMap.set('key', 'value');
|
799
|
+
var ember$data$lib$system$map$$Map = Ember.Map;
|
800
|
+
var ember$data$lib$system$map$$MapWithDefault = Ember.MapWithDefault;
|
801
|
+
var ember$data$lib$system$map$$OrderedSet = Ember.OrderedSet;
|
807
802
|
|
808
|
-
var ember$data$lib$system$map$$
|
809
|
-
|
810
|
-
ember$data$lib$
|
811
|
-
ember$data$lib$system$map$$usesOldBehavior = value === 'key' && key === 'value';
|
812
|
-
});
|
813
|
-
|
814
|
-
ember$data$lib$system$map$$Map.prototype = Ember.create(Ember.Map.prototype);
|
815
|
-
ember$data$lib$system$map$$MapWithDefault.prototype = Ember.create(Ember.MapWithDefault.prototype);
|
816
|
-
ember$data$lib$system$map$$OrderedSet.prototype = Ember.create(Ember.OrderedSet.prototype);
|
803
|
+
var ember$data$lib$system$map$$default = ember$data$lib$system$map$$Map;
|
804
|
+
var ember$data$lib$adapters$rest_adapter$$get = Ember.get;
|
805
|
+
var ember$data$lib$adapters$rest_adapter$$forEach = Ember.ArrayPolyfills.forEach;
|
817
806
|
|
818
|
-
ember$data$lib$
|
819
|
-
|
820
|
-
};
|
807
|
+
var ember$data$lib$adapters$rest_adapter$$default = ember$data$lib$system$adapter$$Adapter.extend({
|
808
|
+
defaultSerializer: '-rest',
|
821
809
|
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
* if we are in pre-Ember.1.8 land, Map/MapWithDefault
|
826
|
-
* forEach calls with key, value, in that order.
|
827
|
-
* >= 1.8 forEach is called with the order value, key as per
|
828
|
-
* the ES6 spec.
|
829
|
-
*/
|
830
|
-
function ember$data$lib$system$map$$translate(valueKeyOrderedCallback){
|
831
|
-
return function(key, value){
|
832
|
-
valueKeyOrderedCallback.call(this, value, key);
|
833
|
-
};
|
834
|
-
}
|
810
|
+
/**
|
811
|
+
By default, the RESTAdapter will send the query params sorted alphabetically to the
|
812
|
+
server.
|
835
813
|
|
836
|
-
|
837
|
-
if (ember$data$lib$system$map$$usesOldBehavior){
|
838
|
-
ember$data$lib$system$map$$mapForEach = function(callback, thisArg){
|
839
|
-
this.__super$forEach(ember$data$lib$system$map$$translate(callback), thisArg);
|
840
|
-
};
|
814
|
+
For example:
|
841
815
|
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
};
|
816
|
+
```js
|
817
|
+
store.find('posts', {sort: 'price', category: 'pets'});
|
818
|
+
```
|
846
819
|
|
847
|
-
|
848
|
-
|
849
|
-
ember$data$lib$system$map$$Map.prototype["delete"] = ember$data$lib$system$map$$deleteFn;
|
820
|
+
will generate a requests like this `/posts?category=pets&sort=price`, even if the
|
821
|
+
parameters were specified in a different order.
|
850
822
|
|
851
|
-
|
852
|
-
|
853
|
-
ember$data$lib$system$map$$MapWithDefault.prototype["delete"] = ember$data$lib$system$map$$deleteFn;
|
823
|
+
That way the generated URL will be deterministic and that simplifies caching mechanisms
|
824
|
+
in the backend.
|
854
825
|
|
855
|
-
|
856
|
-
}
|
826
|
+
Setting `sortQueryParams` to a falsey value will respect the original order.
|
857
827
|
|
858
|
-
|
859
|
-
|
828
|
+
In case you want to sort the query parameters with a different criteria, set
|
829
|
+
`sortQueryParams` to your custom sort function.
|
860
830
|
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
}
|
867
|
-
};
|
831
|
+
```js
|
832
|
+
export default DS.RESTAdapter.extend({
|
833
|
+
sortQueryParams: function(params) {
|
834
|
+
var sortedKeys = Object.keys(params).sort().reverse();
|
835
|
+
var len = sortedKeys.length, newParams = {};
|
868
836
|
|
869
|
-
|
870
|
-
|
871
|
-
|
837
|
+
for (var i = 0; i < len; i++) {
|
838
|
+
newParams[sortedKeys[i]] = params[sortedKeys[i]];
|
839
|
+
}
|
840
|
+
return newParams;
|
841
|
+
}
|
842
|
+
});
|
843
|
+
```
|
872
844
|
|
873
|
-
|
874
|
-
|
875
|
-
|
845
|
+
@method sortQueryParams
|
846
|
+
@param {Object} obj
|
847
|
+
@return {Object}
|
848
|
+
*/
|
849
|
+
sortQueryParams: function(obj) {
|
850
|
+
var keys = Ember.keys(obj);
|
851
|
+
var len = keys.length;
|
852
|
+
if (len < 2) {
|
853
|
+
return obj;
|
854
|
+
}
|
855
|
+
var newQueryParams = {};
|
856
|
+
var sortedKeys = keys.sort();
|
876
857
|
|
877
|
-
|
878
|
-
|
858
|
+
for (var i = 0; i < len; i++) {
|
859
|
+
newQueryParams[sortedKeys[i]] = obj[sortedKeys[i]];
|
860
|
+
}
|
861
|
+
return newQueryParams;
|
862
|
+
},
|
879
863
|
|
880
864
|
/**
|
881
865
|
By default the RESTAdapter will send each find request coming from a `store.find`
|
@@ -883,11 +867,14 @@
|
|
883
867
|
ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests
|
884
868
|
within a single runloop.
|
885
869
|
|
886
|
-
For example, if you have an initial payload of
|
870
|
+
For example, if you have an initial payload of:
|
871
|
+
|
887
872
|
```javascript
|
888
|
-
|
889
|
-
|
890
|
-
|
873
|
+
{
|
874
|
+
post: {
|
875
|
+
id: 1,
|
876
|
+
comments: [1, 2]
|
877
|
+
}
|
891
878
|
}
|
892
879
|
```
|
893
880
|
|
@@ -1036,6 +1023,9 @@
|
|
1036
1023
|
@return {Promise} promise
|
1037
1024
|
*/
|
1038
1025
|
findQuery: function(store, type, query) {
|
1026
|
+
if (this.sortQueryParams) {
|
1027
|
+
query = this.sortQueryParams(query);
|
1028
|
+
}
|
1039
1029
|
return this.ajax(this.buildURL(type.typeKey), 'GET', { data: query });
|
1040
1030
|
},
|
1041
1031
|
|
@@ -1171,7 +1161,8 @@
|
|
1171
1161
|
var data = {};
|
1172
1162
|
var serializer = store.serializerFor(type.typeKey);
|
1173
1163
|
|
1174
|
-
|
1164
|
+
var snapshot = record._createSnapshot();
|
1165
|
+
serializer.serializeIntoHash(data, type, snapshot, { includeId: true });
|
1175
1166
|
|
1176
1167
|
return this.ajax(this.buildURL(type.typeKey, null, record), "POST", { data: data });
|
1177
1168
|
},
|
@@ -1196,7 +1187,8 @@
|
|
1196
1187
|
var data = {};
|
1197
1188
|
var serializer = store.serializerFor(type.typeKey);
|
1198
1189
|
|
1199
|
-
|
1190
|
+
var snapshot = record._createSnapshot();
|
1191
|
+
serializer.serializeIntoHash(data, type, snapshot);
|
1200
1192
|
|
1201
1193
|
var id = ember$data$lib$adapters$rest_adapter$$get(record, 'id');
|
1202
1194
|
|
@@ -1237,9 +1229,9 @@
|
|
1237
1229
|
@return {String} url
|
1238
1230
|
*/
|
1239
1231
|
buildURL: function(type, id, record) {
|
1240
|
-
var url = []
|
1241
|
-
|
1242
|
-
|
1232
|
+
var url = [];
|
1233
|
+
var host = ember$data$lib$adapters$rest_adapter$$get(this, 'host');
|
1234
|
+
var prefix = this.urlPrefix();
|
1243
1235
|
|
1244
1236
|
if (type) { url.push(this.pathForType(type)); }
|
1245
1237
|
|
@@ -1269,8 +1261,15 @@
|
|
1269
1261
|
var url = [];
|
1270
1262
|
|
1271
1263
|
if (path) {
|
1264
|
+
// Protocol relative url
|
1265
|
+
//jscs:disable disallowEmptyBlocks
|
1266
|
+
if (/^\/\//.test(path)) {
|
1267
|
+
// Do nothing, the full host is already included. This branch
|
1268
|
+
// avoids the absolute path logic and the relative path logic.
|
1269
|
+
|
1272
1270
|
// Absolute path
|
1273
|
-
if (path.charAt(0) === '/') {
|
1271
|
+
} else if (path.charAt(0) === '/') {
|
1272
|
+
//jscs:enable disallowEmptyBlocks
|
1274
1273
|
if (host) {
|
1275
1274
|
path = path.slice(1);
|
1276
1275
|
url.push(host);
|
@@ -1297,11 +1296,11 @@
|
|
1297
1296
|
|
1298
1297
|
var expandedURL = url.split('/');
|
1299
1298
|
//Case when the url is of the format ...something/:id
|
1300
|
-
var lastSegment = expandedURL[
|
1299
|
+
var lastSegment = expandedURL[expandedURL.length - 1];
|
1301
1300
|
var id = record.get('id');
|
1302
1301
|
if (lastSegment === id) {
|
1303
1302
|
expandedURL[expandedURL.length - 1] = "";
|
1304
|
-
} else if(ember$data$lib$adapters$rest_adapter$$endsWith(lastSegment, '?id=' + id)) {
|
1303
|
+
} else if (ember$data$lib$adapters$rest_adapter$$endsWith(lastSegment, '?id=' + id)) {
|
1305
1304
|
//Case when the url is of the format ...something?id=:id
|
1306
1305
|
expandedURL[expandedURL.length - 1] = lastSegment.substring(0, lastSegment.length - id.length - 1);
|
1307
1306
|
}
|
@@ -1309,9 +1308,7 @@
|
|
1309
1308
|
return expandedURL.join('/');
|
1310
1309
|
},
|
1311
1310
|
|
1312
|
-
|
1313
|
-
http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers
|
1314
|
-
*/
|
1311
|
+
// http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers
|
1315
1312
|
maxUrlLength: 2048,
|
1316
1313
|
|
1317
1314
|
/**
|
@@ -1337,11 +1334,11 @@
|
|
1337
1334
|
loaded separately by `findMany`.
|
1338
1335
|
*/
|
1339
1336
|
groupRecordsForFindMany: function (store, records) {
|
1340
|
-
var groups = ember$data$lib$system$map$$MapWithDefault.create({defaultValue: function(){return [];}});
|
1337
|
+
var groups = ember$data$lib$system$map$$MapWithDefault.create({ defaultValue: function() { return []; } });
|
1341
1338
|
var adapter = this;
|
1342
1339
|
var maxUrlLength = this.maxUrlLength;
|
1343
1340
|
|
1344
|
-
ember$data$lib$adapters$rest_adapter$$forEach.call(records, function(record){
|
1341
|
+
ember$data$lib$adapters$rest_adapter$$forEach.call(records, function(record) {
|
1345
1342
|
var baseUrl = adapter._stripIDFromURL(store, record);
|
1346
1343
|
groups.get(baseUrl).push(record);
|
1347
1344
|
});
|
@@ -1368,7 +1365,7 @@
|
|
1368
1365
|
}
|
1369
1366
|
|
1370
1367
|
var groupsArray = [];
|
1371
|
-
groups.forEach(function(group, key){
|
1368
|
+
groups.forEach(function(group, key) {
|
1372
1369
|
var paramNameLength = '&ids%5B%5D='.length;
|
1373
1370
|
var splitGroups = splitGroupToFitInUrl(group, maxUrlLength, paramNameLength);
|
1374
1371
|
|
@@ -1456,7 +1453,11 @@
|
|
1456
1453
|
if (isObject) {
|
1457
1454
|
jqXHR.then = null;
|
1458
1455
|
if (!jqXHR.errorThrown) {
|
1459
|
-
|
1456
|
+
if (typeof errorThrown === 'string') {
|
1457
|
+
jqXHR.errorThrown = new Error(errorThrown);
|
1458
|
+
} else {
|
1459
|
+
jqXHR.errorThrown = errorThrown;
|
1460
|
+
}
|
1460
1461
|
}
|
1461
1462
|
}
|
1462
1463
|
|
@@ -1510,7 +1511,7 @@
|
|
1510
1511
|
@private
|
1511
1512
|
@param {String} url
|
1512
1513
|
@param {String} type The request type GET, POST, PUT, DELETE etc.
|
1513
|
-
@param {Object}
|
1514
|
+
@param {Object} options
|
1514
1515
|
@return {Promise} promise
|
1515
1516
|
*/
|
1516
1517
|
ajax: function(url, type, options) {
|
@@ -1541,8 +1542,8 @@
|
|
1541
1542
|
@private
|
1542
1543
|
@param {String} url
|
1543
1544
|
@param {String} type The request type GET, POST, PUT, DELETE etc.
|
1544
|
-
@param {Object}
|
1545
|
-
@return {Object}
|
1545
|
+
@param {Object} options
|
1546
|
+
@return {Object}
|
1546
1547
|
*/
|
1547
1548
|
ajaxOptions: function(url, type, options) {
|
1548
1549
|
var hash = options || {};
|
@@ -1570,14 +1571,13 @@
|
|
1570
1571
|
});
|
1571
1572
|
|
1572
1573
|
//From http://stackoverflow.com/questions/280634/endswith-in-javascript
|
1573
|
-
function ember$data$lib$adapters$rest_adapter$$endsWith(string, suffix){
|
1574
|
+
function ember$data$lib$adapters$rest_adapter$$endsWith(string, suffix) {
|
1574
1575
|
if (typeof String.prototype.endsWith !== 'function') {
|
1575
1576
|
return string.indexOf(suffix, string.length - suffix.length) !== -1;
|
1576
1577
|
} else {
|
1577
1578
|
return string.endsWith(suffix);
|
1578
1579
|
}
|
1579
1580
|
}
|
1580
|
-
|
1581
1581
|
var ember$inflector$lib$system$inflector$$capitalize = Ember.String.capitalize;
|
1582
1582
|
|
1583
1583
|
var ember$inflector$lib$system$inflector$$BLANK_REGEX = /^\s*$/;
|
@@ -2046,8 +2046,8 @@
|
|
2046
2046
|
@module ember-data
|
2047
2047
|
*/
|
2048
2048
|
|
2049
|
-
var activemodel$adapter$lib$system$active_model_adapter$$decamelize = Ember.String.decamelize
|
2050
|
-
|
2049
|
+
var activemodel$adapter$lib$system$active_model_adapter$$decamelize = Ember.String.decamelize;
|
2050
|
+
var activemodel$adapter$lib$system$active_model_adapter$$underscore = Ember.String.underscore;
|
2051
2051
|
|
2052
2052
|
/**
|
2053
2053
|
The ActiveModelAdapter is a subclass of the RESTAdapter designed to integrate
|
@@ -2189,12 +2189,87 @@
|
|
2189
2189
|
});
|
2190
2190
|
|
2191
2191
|
var activemodel$adapter$lib$system$active_model_adapter$$default = activemodel$adapter$lib$system$active_model_adapter$$ActiveModelAdapter;
|
2192
|
+
/**
|
2193
|
+
@module ember-data
|
2194
|
+
*/
|
2195
|
+
|
2196
|
+
/**
|
2197
|
+
`DS.Serializer` is an abstract base class that you should override in your
|
2198
|
+
application to customize it for your backend. The minimum set of methods
|
2199
|
+
that you should implement is:
|
2200
|
+
|
2201
|
+
* `extract()`
|
2202
|
+
* `serialize()`
|
2203
|
+
|
2204
|
+
And you can optionally override the following methods:
|
2205
|
+
|
2206
|
+
* `normalize()`
|
2207
|
+
|
2208
|
+
For an example implementation, see
|
2209
|
+
[DS.JSONSerializer](DS.JSONSerializer.html), the included JSON serializer.
|
2210
|
+
|
2211
|
+
@class Serializer
|
2212
|
+
@namespace DS
|
2213
|
+
@extends Ember.Object
|
2214
|
+
*/
|
2215
|
+
|
2216
|
+
var ember$data$lib$system$serializer$$Serializer = Ember.Object.extend({
|
2217
|
+
|
2218
|
+
/**
|
2219
|
+
The `extract` method is used to deserialize the payload received from your
|
2220
|
+
data source into the form that Ember Data expects.
|
2221
|
+
|
2222
|
+
@method extract
|
2223
|
+
@param {DS.Store} store
|
2224
|
+
@param {subclass of DS.Model} type
|
2225
|
+
@param {Object} payload
|
2226
|
+
@param {String|Number} id
|
2227
|
+
@param {String} requestType
|
2228
|
+
@return {Object}
|
2229
|
+
*/
|
2230
|
+
extract: Ember.required(Function),
|
2231
|
+
|
2232
|
+
/**
|
2233
|
+
The `serialize` method is used when a record is saved in order to convert
|
2234
|
+
the record into the form that your external data source expects.
|
2235
|
+
|
2236
|
+
`serialize` takes an optional `options` hash with a single option:
|
2237
|
+
|
2238
|
+
- `includeId`: If this is `true`, `serialize` should include the ID
|
2239
|
+
in the serialized object it builds.
|
2240
|
+
|
2241
|
+
@method serialize
|
2242
|
+
@param {subclass of DS.Model} record
|
2243
|
+
@param {Object} [options]
|
2244
|
+
@return {Object}
|
2245
|
+
*/
|
2246
|
+
serialize: Ember.required(Function),
|
2247
|
+
|
2248
|
+
/**
|
2249
|
+
The `normalize` method is used to convert a payload received from your
|
2250
|
+
external data source into the normalized form `store.push()` expects. You
|
2251
|
+
should override this method, munge the hash and return the normalized
|
2252
|
+
payload.
|
2253
|
+
|
2254
|
+
@method normalize
|
2255
|
+
@param {subclass of DS.Model} type
|
2256
|
+
@param {Object} hash
|
2257
|
+
@return {Object}
|
2258
|
+
*/
|
2259
|
+
normalize: function(type, hash) {
|
2260
|
+
return hash;
|
2261
|
+
}
|
2262
|
+
|
2263
|
+
});
|
2264
|
+
|
2265
|
+
var ember$data$lib$system$serializer$$default = ember$data$lib$system$serializer$$Serializer;
|
2266
|
+
|
2192
2267
|
var ember$data$lib$serializers$json_serializer$$get = Ember.get;
|
2193
2268
|
var ember$data$lib$serializers$json_serializer$$isNone = Ember.isNone;
|
2194
2269
|
var ember$data$lib$serializers$json_serializer$$map = Ember.ArrayPolyfills.map;
|
2195
2270
|
var ember$data$lib$serializers$json_serializer$$merge = Ember.merge;
|
2196
2271
|
|
2197
|
-
var ember$data$lib$serializers$json_serializer$$default =
|
2272
|
+
var ember$data$lib$serializers$json_serializer$$default = ember$data$lib$system$serializer$$default.extend({
|
2198
2273
|
/**
|
2199
2274
|
The primaryKey is used when serializing and deserializing
|
2200
2275
|
data. Ember Data always uses the `id` property to store the id of
|
@@ -2408,7 +2483,8 @@
|
|
2408
2483
|
@private
|
2409
2484
|
*/
|
2410
2485
|
normalizeUsingDeclaredMapping: function(type, hash) {
|
2411
|
-
var attrs = ember$data$lib$serializers$json_serializer$$get(this, 'attrs')
|
2486
|
+
var attrs = ember$data$lib$serializers$json_serializer$$get(this, 'attrs');
|
2487
|
+
var payloadKey, key;
|
2412
2488
|
|
2413
2489
|
if (attrs) {
|
2414
2490
|
for (key in attrs) {
|
@@ -2462,10 +2538,10 @@
|
|
2462
2538
|
mappedKey = attrs[key];
|
2463
2539
|
//We need to account for both the {title: 'post_title'} and
|
2464
2540
|
//{title: {key: 'post_title'}} forms
|
2465
|
-
if (mappedKey.key){
|
2541
|
+
if (mappedKey.key) {
|
2466
2542
|
mappedKey = mappedKey.key;
|
2467
2543
|
}
|
2468
|
-
if (typeof mappedKey === 'string'){
|
2544
|
+
if (typeof mappedKey === 'string') {
|
2469
2545
|
key = mappedKey;
|
2470
2546
|
}
|
2471
2547
|
}
|
@@ -2544,15 +2620,15 @@
|
|
2544
2620
|
|
2545
2621
|
```javascript
|
2546
2622
|
App.PostSerializer = DS.JSONSerializer.extend({
|
2547
|
-
serialize: function(
|
2623
|
+
serialize: function(snapshot, options) {
|
2548
2624
|
var json = {
|
2549
|
-
POST_TTL:
|
2550
|
-
POST_BDY:
|
2551
|
-
POST_CMS:
|
2625
|
+
POST_TTL: snapshot.attr('title'),
|
2626
|
+
POST_BDY: snapshot.attr('body'),
|
2627
|
+
POST_CMS: snapshot.hasMany('comments', { ids: true })
|
2552
2628
|
}
|
2553
2629
|
|
2554
2630
|
if (options.includeId) {
|
2555
|
-
json.POST_ID_ =
|
2631
|
+
json.POST_ID_ = snapshot.id;
|
2556
2632
|
}
|
2557
2633
|
|
2558
2634
|
return json;
|
@@ -2568,21 +2644,21 @@
|
|
2568
2644
|
|
2569
2645
|
```javascript
|
2570
2646
|
App.ApplicationSerializer = DS.JSONSerializer.extend({
|
2571
|
-
serialize: function(
|
2647
|
+
serialize: function(snapshot, options) {
|
2572
2648
|
var json = {};
|
2573
2649
|
|
2574
|
-
|
2575
|
-
json[serverAttributeName(name)] =
|
2650
|
+
snapshot.eachAttribute(function(name) {
|
2651
|
+
json[serverAttributeName(name)] = snapshot.attr(name);
|
2576
2652
|
})
|
2577
2653
|
|
2578
|
-
|
2654
|
+
snapshot.eachRelationship(function(name, relationship) {
|
2579
2655
|
if (relationship.kind === 'hasMany') {
|
2580
|
-
json[serverHasManyName(name)] =
|
2656
|
+
json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });
|
2581
2657
|
}
|
2582
2658
|
});
|
2583
2659
|
|
2584
2660
|
if (options.includeId) {
|
2585
|
-
json.ID_ =
|
2661
|
+
json.ID_ = snapshot.id;
|
2586
2662
|
}
|
2587
2663
|
|
2588
2664
|
return json;
|
@@ -2616,7 +2692,7 @@
|
|
2616
2692
|
|
2617
2693
|
```javascript
|
2618
2694
|
App.PostSerializer = DS.JSONSerializer.extend({
|
2619
|
-
serialize: function(
|
2695
|
+
serialize: function(snapshot, options) {
|
2620
2696
|
var json = this._super.apply(this, arguments);
|
2621
2697
|
|
2622
2698
|
json.subject = json.title;
|
@@ -2628,30 +2704,30 @@
|
|
2628
2704
|
```
|
2629
2705
|
|
2630
2706
|
@method serialize
|
2631
|
-
@param {
|
2707
|
+
@param {DS.Snapshot} snapshot
|
2632
2708
|
@param {Object} options
|
2633
2709
|
@return {Object} json
|
2634
2710
|
*/
|
2635
|
-
serialize: function(
|
2711
|
+
serialize: function(snapshot, options) {
|
2636
2712
|
var json = {};
|
2637
2713
|
|
2638
2714
|
if (options && options.includeId) {
|
2639
|
-
var id =
|
2715
|
+
var id = snapshot.id;
|
2640
2716
|
|
2641
2717
|
if (id) {
|
2642
2718
|
json[ember$data$lib$serializers$json_serializer$$get(this, 'primaryKey')] = id;
|
2643
2719
|
}
|
2644
2720
|
}
|
2645
2721
|
|
2646
|
-
|
2647
|
-
this.serializeAttribute(
|
2722
|
+
snapshot.eachAttribute(function(key, attribute) {
|
2723
|
+
this.serializeAttribute(snapshot, json, key, attribute);
|
2648
2724
|
}, this);
|
2649
2725
|
|
2650
|
-
|
2726
|
+
snapshot.eachRelationship(function(key, relationship) {
|
2651
2727
|
if (relationship.kind === 'belongsTo') {
|
2652
|
-
this.serializeBelongsTo(
|
2728
|
+
this.serializeBelongsTo(snapshot, json, relationship);
|
2653
2729
|
} else if (relationship.kind === 'hasMany') {
|
2654
|
-
this.serializeHasMany(
|
2730
|
+
this.serializeHasMany(snapshot, json, relationship);
|
2655
2731
|
}
|
2656
2732
|
}, this);
|
2657
2733
|
|
@@ -2669,9 +2745,9 @@
|
|
2669
2745
|
|
2670
2746
|
```js
|
2671
2747
|
App.ApplicationSerializer = DS.RESTSerializer.extend({
|
2672
|
-
serializeIntoHash: function(data, type,
|
2748
|
+
serializeIntoHash: function(data, type, snapshot, options) {
|
2673
2749
|
var root = Ember.String.decamelize(type.typeKey);
|
2674
|
-
data[root] = this.serialize(
|
2750
|
+
data[root] = this.serialize(snapshot, options);
|
2675
2751
|
}
|
2676
2752
|
});
|
2677
2753
|
```
|
@@ -2679,11 +2755,11 @@
|
|
2679
2755
|
@method serializeIntoHash
|
2680
2756
|
@param {Object} hash
|
2681
2757
|
@param {subclass of DS.Model} type
|
2682
|
-
@param {DS.
|
2758
|
+
@param {DS.Snapshot} snapshot
|
2683
2759
|
@param {Object} options
|
2684
2760
|
*/
|
2685
|
-
serializeIntoHash: function(hash, type,
|
2686
|
-
ember$data$lib$serializers$json_serializer$$merge(hash, this.serialize(
|
2761
|
+
serializeIntoHash: function(hash, type, snapshot, options) {
|
2762
|
+
ember$data$lib$serializers$json_serializer$$merge(hash, this.serialize(snapshot, options));
|
2687
2763
|
},
|
2688
2764
|
|
2689
2765
|
/**
|
@@ -2696,24 +2772,24 @@
|
|
2696
2772
|
|
2697
2773
|
```javascript
|
2698
2774
|
App.ApplicationSerializer = DS.JSONSerializer.extend({
|
2699
|
-
serializeAttribute: function(
|
2775
|
+
serializeAttribute: function(snapshot, json, key, attributes) {
|
2700
2776
|
json.attributes = json.attributes || {};
|
2701
|
-
this._super(
|
2777
|
+
this._super(snapshot, json.attributes, key, attributes);
|
2702
2778
|
}
|
2703
2779
|
});
|
2704
2780
|
```
|
2705
2781
|
|
2706
2782
|
@method serializeAttribute
|
2707
|
-
@param {DS.
|
2783
|
+
@param {DS.Snapshot} snapshot
|
2708
2784
|
@param {Object} json
|
2709
2785
|
@param {String} key
|
2710
2786
|
@param {Object} attribute
|
2711
2787
|
*/
|
2712
|
-
serializeAttribute: function(
|
2788
|
+
serializeAttribute: function(snapshot, json, key, attribute) {
|
2713
2789
|
var type = attribute.type;
|
2714
2790
|
|
2715
2791
|
if (this._canSerialize(key)) {
|
2716
|
-
var value =
|
2792
|
+
var value = snapshot.attr(key);
|
2717
2793
|
if (type) {
|
2718
2794
|
var transform = this.transformFor(type);
|
2719
2795
|
value = transform.serialize(value);
|
@@ -2739,28 +2815,28 @@
|
|
2739
2815
|
|
2740
2816
|
```javascript
|
2741
2817
|
App.PostSerializer = DS.JSONSerializer.extend({
|
2742
|
-
serializeBelongsTo: function(
|
2818
|
+
serializeBelongsTo: function(snapshot, json, relationship) {
|
2743
2819
|
var key = relationship.key;
|
2744
2820
|
|
2745
|
-
var belongsTo =
|
2821
|
+
var belongsTo = snapshot.belongsTo(key);
|
2746
2822
|
|
2747
2823
|
key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo") : key;
|
2748
2824
|
|
2749
|
-
json[key] = Ember.isNone(belongsTo) ? belongsTo : belongsTo.toJSON();
|
2825
|
+
json[key] = Ember.isNone(belongsTo) ? belongsTo : belongsTo.record.toJSON();
|
2750
2826
|
}
|
2751
2827
|
});
|
2752
2828
|
```
|
2753
2829
|
|
2754
2830
|
@method serializeBelongsTo
|
2755
|
-
@param {DS.
|
2831
|
+
@param {DS.Snapshot} snapshot
|
2756
2832
|
@param {Object} json
|
2757
2833
|
@param {Object} relationship
|
2758
2834
|
*/
|
2759
|
-
serializeBelongsTo: function(
|
2835
|
+
serializeBelongsTo: function(snapshot, json, relationship) {
|
2760
2836
|
var key = relationship.key;
|
2761
2837
|
|
2762
2838
|
if (this._canSerialize(key)) {
|
2763
|
-
var
|
2839
|
+
var belongsToId = snapshot.belongsTo(key, { id: true });
|
2764
2840
|
|
2765
2841
|
// if provided, use the mapping provided by `attrs` in
|
2766
2842
|
// the serializer
|
@@ -2770,14 +2846,14 @@
|
|
2770
2846
|
}
|
2771
2847
|
|
2772
2848
|
//Need to check whether the id is there for new&async records
|
2773
|
-
if (ember$data$lib$serializers$json_serializer$$isNone(
|
2849
|
+
if (ember$data$lib$serializers$json_serializer$$isNone(belongsToId)) {
|
2774
2850
|
json[payloadKey] = null;
|
2775
2851
|
} else {
|
2776
|
-
json[payloadKey] =
|
2852
|
+
json[payloadKey] = belongsToId;
|
2777
2853
|
}
|
2778
2854
|
|
2779
2855
|
if (relationship.options.polymorphic) {
|
2780
|
-
this.serializePolymorphicType(
|
2856
|
+
this.serializePolymorphicType(snapshot, json, relationship);
|
2781
2857
|
}
|
2782
2858
|
}
|
2783
2859
|
},
|
@@ -2790,7 +2866,7 @@
|
|
2790
2866
|
|
2791
2867
|
```javascript
|
2792
2868
|
App.PostSerializer = DS.JSONSerializer.extend({
|
2793
|
-
serializeHasMany: function(
|
2869
|
+
serializeHasMany: function(snapshot, json, relationship) {
|
2794
2870
|
var key = relationship.key;
|
2795
2871
|
if (key === 'comments') {
|
2796
2872
|
return;
|
@@ -2802,11 +2878,11 @@
|
|
2802
2878
|
```
|
2803
2879
|
|
2804
2880
|
@method serializeHasMany
|
2805
|
-
@param {DS.
|
2881
|
+
@param {DS.Snapshot} snapshot
|
2806
2882
|
@param {Object} json
|
2807
2883
|
@param {Object} relationship
|
2808
2884
|
*/
|
2809
|
-
serializeHasMany: function(
|
2885
|
+
serializeHasMany: function(snapshot, json, relationship) {
|
2810
2886
|
var key = relationship.key;
|
2811
2887
|
|
2812
2888
|
if (this._canSerialize(key)) {
|
@@ -2819,10 +2895,10 @@
|
|
2819
2895
|
payloadKey = this.keyForRelationship(key, "hasMany");
|
2820
2896
|
}
|
2821
2897
|
|
2822
|
-
var relationshipType =
|
2898
|
+
var relationshipType = snapshot.type.determineRelationshipType(relationship);
|
2823
2899
|
|
2824
2900
|
if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany') {
|
2825
|
-
json[payloadKey] =
|
2901
|
+
json[payloadKey] = snapshot.hasMany(key, { ids: true });
|
2826
2902
|
// TODO support for polymorphic manyToNone and manyToMany relationships
|
2827
2903
|
}
|
2828
2904
|
}
|
@@ -2838,22 +2914,22 @@
|
|
2838
2914
|
|
2839
2915
|
```javascript
|
2840
2916
|
App.CommentSerializer = DS.JSONSerializer.extend({
|
2841
|
-
serializePolymorphicType: function(
|
2917
|
+
serializePolymorphicType: function(snapshot, json, relationship) {
|
2842
2918
|
var key = relationship.key,
|
2843
|
-
belongsTo =
|
2919
|
+
belongsTo = snapshot.belongsTo(key);
|
2844
2920
|
key = this.keyForAttribute ? this.keyForAttribute(key) : key;
|
2845
2921
|
|
2846
2922
|
if (Ember.isNone(belongsTo)) {
|
2847
2923
|
json[key + "_type"] = null;
|
2848
2924
|
} else {
|
2849
|
-
json[key + "_type"] = belongsTo.
|
2925
|
+
json[key + "_type"] = belongsTo.typeKey;
|
2850
2926
|
}
|
2851
2927
|
}
|
2852
2928
|
});
|
2853
2929
|
```
|
2854
2930
|
|
2855
2931
|
@method serializePolymorphicType
|
2856
|
-
@param {DS.
|
2932
|
+
@param {DS.Snapshot} snapshot
|
2857
2933
|
@param {Object} json
|
2858
2934
|
@param {Object} relationship
|
2859
2935
|
*/
|
@@ -2871,17 +2947,20 @@
|
|
2871
2947
|
This method delegates to a more specific extract method based on
|
2872
2948
|
the `requestType`.
|
2873
2949
|
|
2874
|
-
|
2950
|
+
To override this method with a custom one, make sure to call
|
2951
|
+
`this._super(store, type, payload, id, requestType)` with your
|
2952
|
+
pre-processed data.
|
2953
|
+
|
2954
|
+
Here's an example of using `extract` manually:
|
2875
2955
|
|
2876
2956
|
```javascript
|
2877
|
-
var get = Ember.get;
|
2878
2957
|
socket.on('message', function(message) {
|
2879
|
-
var modelName = message.model;
|
2880
2958
|
var data = message.data;
|
2881
|
-
var type = store.modelFor(modelName);
|
2959
|
+
var type = store.modelFor(message.modelName);
|
2882
2960
|
var serializer = store.serializerFor(type.typeKey);
|
2883
|
-
var record = serializer.extract(store, type, data,
|
2884
|
-
|
2961
|
+
var record = serializer.extract(store, type, data, data.id, 'single');
|
2962
|
+
|
2963
|
+
store.push(message.modelName, record);
|
2885
2964
|
});
|
2886
2965
|
```
|
2887
2966
|
|
@@ -2913,7 +2992,7 @@
|
|
2913
2992
|
@param {String} requestType
|
2914
2993
|
@return {Array} array An array of deserialized objects
|
2915
2994
|
*/
|
2916
|
-
extractFindAll: function(store, type, payload, id, requestType){
|
2995
|
+
extractFindAll: function(store, type, payload, id, requestType) {
|
2917
2996
|
return this.extractArray(store, type, payload, id, requestType);
|
2918
2997
|
},
|
2919
2998
|
/**
|
@@ -2929,7 +3008,7 @@
|
|
2929
3008
|
@param {String} requestType
|
2930
3009
|
@return {Array} array An array of deserialized objects
|
2931
3010
|
*/
|
2932
|
-
extractFindQuery: function(store, type, payload, id, requestType){
|
3011
|
+
extractFindQuery: function(store, type, payload, id, requestType) {
|
2933
3012
|
return this.extractArray(store, type, payload, id, requestType);
|
2934
3013
|
},
|
2935
3014
|
/**
|
@@ -2945,7 +3024,7 @@
|
|
2945
3024
|
@param {String} requestType
|
2946
3025
|
@return {Array} array An array of deserialized objects
|
2947
3026
|
*/
|
2948
|
-
extractFindMany: function(store, type, payload, id, requestType){
|
3027
|
+
extractFindMany: function(store, type, payload, id, requestType) {
|
2949
3028
|
return this.extractArray(store, type, payload, id, requestType);
|
2950
3029
|
},
|
2951
3030
|
/**
|
@@ -2961,7 +3040,7 @@
|
|
2961
3040
|
@param {String} requestType
|
2962
3041
|
@return {Array} array An array of deserialized objects
|
2963
3042
|
*/
|
2964
|
-
extractFindHasMany: function(store, type, payload, id, requestType){
|
3043
|
+
extractFindHasMany: function(store, type, payload, id, requestType) {
|
2965
3044
|
return this.extractArray(store, type, payload, id, requestType);
|
2966
3045
|
},
|
2967
3046
|
|
@@ -3158,7 +3237,7 @@
|
|
3158
3237
|
|
3159
3238
|
/**
|
3160
3239
|
`extractErrors` is used to extract model errors when a call is made
|
3161
|
-
to `DS.Model#save` which fails with an InvalidError`. By default
|
3240
|
+
to `DS.Model#save` which fails with an `InvalidError`. By default
|
3162
3241
|
Ember Data expects error information to be located on the `errors`
|
3163
3242
|
property of the payload object.
|
3164
3243
|
|
@@ -3209,7 +3288,7 @@
|
|
3209
3288
|
@param {String} key
|
3210
3289
|
@return {String} normalized key
|
3211
3290
|
*/
|
3212
|
-
keyForAttribute: function(key){
|
3291
|
+
keyForAttribute: function(key) {
|
3213
3292
|
return key;
|
3214
3293
|
},
|
3215
3294
|
|
@@ -3234,7 +3313,7 @@
|
|
3234
3313
|
@return {String} normalized key
|
3235
3314
|
*/
|
3236
3315
|
|
3237
|
-
keyForRelationship: function(key, type){
|
3316
|
+
keyForRelationship: function(key, type) {
|
3238
3317
|
return key;
|
3239
3318
|
},
|
3240
3319
|
|
@@ -3254,7 +3333,6 @@
|
|
3254
3333
|
}
|
3255
3334
|
});
|
3256
3335
|
|
3257
|
-
var ember$data$lib$serializers$rest_serializer$$get = Ember.get;
|
3258
3336
|
var ember$data$lib$serializers$rest_serializer$$forEach = Ember.ArrayPolyfills.forEach;
|
3259
3337
|
var ember$data$lib$serializers$rest_serializer$$map = Ember.ArrayPolyfills.map;
|
3260
3338
|
var ember$data$lib$serializers$rest_serializer$$camelize = Ember.String.camelize;
|
@@ -3517,7 +3595,7 @@
|
|
3517
3595
|
for (var prop in payload) {
|
3518
3596
|
var typeName = this.typeForRoot(prop);
|
3519
3597
|
|
3520
|
-
if (!store.modelFactoryFor(typeName)){
|
3598
|
+
if (!store.modelFactoryFor(typeName)) {
|
3521
3599
|
Ember.warn(this.warnMessageNoModelForKey(prop, typeName), false);
|
3522
3600
|
continue;
|
3523
3601
|
}
|
@@ -3737,7 +3815,7 @@
|
|
3737
3815
|
|
3738
3816
|
for (var prop in payload) {
|
3739
3817
|
var typeName = this.typeForRoot(prop);
|
3740
|
-
if (!store.modelFactoryFor(typeName, prop)){
|
3818
|
+
if (!store.modelFactoryFor(typeName, prop)) {
|
3741
3819
|
Ember.warn(this.warnMessageNoModelForKey(prop, typeName), false);
|
3742
3820
|
continue;
|
3743
3821
|
}
|
@@ -3857,15 +3935,15 @@
|
|
3857
3935
|
|
3858
3936
|
```js
|
3859
3937
|
App.PostSerializer = DS.RESTSerializer.extend({
|
3860
|
-
serialize: function(
|
3938
|
+
serialize: function(snapshot, options) {
|
3861
3939
|
var json = {
|
3862
|
-
POST_TTL:
|
3863
|
-
POST_BDY:
|
3864
|
-
POST_CMS:
|
3940
|
+
POST_TTL: snapshot.attr('title'),
|
3941
|
+
POST_BDY: snapshot.attr('body'),
|
3942
|
+
POST_CMS: snapshot.hasMany('comments', { ids: true })
|
3865
3943
|
}
|
3866
3944
|
|
3867
3945
|
if (options.includeId) {
|
3868
|
-
json.POST_ID_ =
|
3946
|
+
json.POST_ID_ = snapshot.id;
|
3869
3947
|
}
|
3870
3948
|
|
3871
3949
|
return json;
|
@@ -3881,21 +3959,21 @@
|
|
3881
3959
|
|
3882
3960
|
```js
|
3883
3961
|
App.ApplicationSerializer = DS.RESTSerializer.extend({
|
3884
|
-
serialize: function(
|
3962
|
+
serialize: function(snapshot, options) {
|
3885
3963
|
var json = {};
|
3886
3964
|
|
3887
|
-
|
3888
|
-
json[serverAttributeName(name)] =
|
3965
|
+
snapshot.eachAttribute(function(name) {
|
3966
|
+
json[serverAttributeName(name)] = snapshot.attr(name);
|
3889
3967
|
})
|
3890
3968
|
|
3891
|
-
|
3969
|
+
snapshot.eachRelationship(function(name, relationship) {
|
3892
3970
|
if (relationship.kind === 'hasMany') {
|
3893
|
-
json[serverHasManyName(name)] =
|
3971
|
+
json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });
|
3894
3972
|
}
|
3895
3973
|
});
|
3896
3974
|
|
3897
3975
|
if (options.includeId) {
|
3898
|
-
json.ID_ =
|
3976
|
+
json.ID_ = snapshot.id;
|
3899
3977
|
}
|
3900
3978
|
|
3901
3979
|
return json;
|
@@ -3929,8 +4007,8 @@
|
|
3929
4007
|
|
3930
4008
|
```js
|
3931
4009
|
App.PostSerializer = DS.RESTSerializer.extend({
|
3932
|
-
serialize: function(
|
3933
|
-
var json = this._super(
|
4010
|
+
serialize: function(snapshot, options) {
|
4011
|
+
var json = this._super(snapshot, options);
|
3934
4012
|
|
3935
4013
|
json.subject = json.title;
|
3936
4014
|
delete json.title;
|
@@ -3941,11 +4019,11 @@
|
|
3941
4019
|
```
|
3942
4020
|
|
3943
4021
|
@method serialize
|
3944
|
-
@param {
|
4022
|
+
@param {DS.Snapshot} snapshot
|
3945
4023
|
@param {Object} options
|
3946
4024
|
@return {Object} json
|
3947
4025
|
*/
|
3948
|
-
serialize: function(
|
4026
|
+
serialize: function(snapshot, options) {
|
3949
4027
|
return this._super.apply(this, arguments);
|
3950
4028
|
},
|
3951
4029
|
|
@@ -3968,11 +4046,11 @@
|
|
3968
4046
|
@method serializeIntoHash
|
3969
4047
|
@param {Object} hash
|
3970
4048
|
@param {subclass of DS.Model} type
|
3971
|
-
@param {DS.
|
4049
|
+
@param {DS.Snapshot} snapshot
|
3972
4050
|
@param {Object} options
|
3973
4051
|
*/
|
3974
|
-
serializeIntoHash: function(hash, type,
|
3975
|
-
hash[type.typeKey] = this.serialize(
|
4052
|
+
serializeIntoHash: function(hash, type, snapshot, options) {
|
4053
|
+
hash[type.typeKey] = this.serialize(snapshot, options);
|
3976
4054
|
},
|
3977
4055
|
|
3978
4056
|
/**
|
@@ -3981,25 +4059,25 @@
|
|
3981
4059
|
the attribute and value from the model's camelcased model name.
|
3982
4060
|
|
3983
4061
|
@method serializePolymorphicType
|
3984
|
-
@param {DS.
|
4062
|
+
@param {DS.Snapshot} snapshot
|
3985
4063
|
@param {Object} json
|
3986
4064
|
@param {Object} relationship
|
3987
4065
|
*/
|
3988
|
-
serializePolymorphicType: function(
|
4066
|
+
serializePolymorphicType: function(snapshot, json, relationship) {
|
3989
4067
|
var key = relationship.key;
|
3990
|
-
var belongsTo =
|
4068
|
+
var belongsTo = snapshot.belongsTo(key);
|
3991
4069
|
key = this.keyForAttribute ? this.keyForAttribute(key) : key;
|
3992
4070
|
if (Ember.isNone(belongsTo)) {
|
3993
4071
|
json[key + "Type"] = null;
|
3994
4072
|
} else {
|
3995
|
-
json[key + "Type"] = Ember.String.camelize(belongsTo.
|
4073
|
+
json[key + "Type"] = Ember.String.camelize(belongsTo.typeKey);
|
3996
4074
|
}
|
3997
4075
|
}
|
3998
4076
|
});
|
3999
4077
|
|
4000
|
-
Ember.runInDebug(function(){
|
4078
|
+
Ember.runInDebug(function() {
|
4001
4079
|
ember$data$lib$serializers$rest_serializer$$RESTSerializer.reopen({
|
4002
|
-
warnMessageNoModelForKey: function(prop, typeKey){
|
4080
|
+
warnMessageNoModelForKey: function(prop, typeKey) {
|
4003
4081
|
return 'Encountered "' + prop + '" in payload, but no model was found for model name "' + typeKey + '" (resolved model name using ' + this.constructor.toString() + '.typeForRoot("' + prop + '"))';
|
4004
4082
|
}
|
4005
4083
|
});
|
@@ -4010,12 +4088,12 @@
|
|
4010
4088
|
@module ember-data
|
4011
4089
|
*/
|
4012
4090
|
|
4013
|
-
var activemodel$adapter$lib$system$active_model_serializer$$
|
4014
|
-
|
4015
|
-
|
4016
|
-
|
4017
|
-
|
4018
|
-
|
4091
|
+
var activemodel$adapter$lib$system$active_model_serializer$$forEach = Ember.EnumerableUtils.forEach;
|
4092
|
+
var activemodel$adapter$lib$system$active_model_serializer$$camelize = Ember.String.camelize;
|
4093
|
+
var activemodel$adapter$lib$system$active_model_serializer$$capitalize = Ember.String.capitalize;
|
4094
|
+
var activemodel$adapter$lib$system$active_model_serializer$$decamelize = Ember.String.decamelize;
|
4095
|
+
var activemodel$adapter$lib$system$active_model_serializer$$underscore = Ember.String.underscore;
|
4096
|
+
|
4019
4097
|
/**
|
4020
4098
|
The ActiveModelSerializer is a subclass of the RESTSerializer designed to integrate
|
4021
4099
|
with a JSON API that uses an underscored naming convention instead of camelCasing.
|
@@ -4148,31 +4226,31 @@
|
|
4148
4226
|
@method serializeIntoHash
|
4149
4227
|
@param {Object} hash
|
4150
4228
|
@param {subclass of DS.Model} type
|
4151
|
-
@param {DS.
|
4229
|
+
@param {DS.Snapshot} snapshot
|
4152
4230
|
@param {Object} options
|
4153
4231
|
*/
|
4154
|
-
serializeIntoHash: function(data, type,
|
4232
|
+
serializeIntoHash: function(data, type, snapshot, options) {
|
4155
4233
|
var root = activemodel$adapter$lib$system$active_model_serializer$$underscore(activemodel$adapter$lib$system$active_model_serializer$$decamelize(type.typeKey));
|
4156
|
-
data[root] = this.serialize(
|
4234
|
+
data[root] = this.serialize(snapshot, options);
|
4157
4235
|
},
|
4158
4236
|
|
4159
4237
|
/**
|
4160
4238
|
Serializes a polymorphic type as a fully capitalized model name.
|
4161
4239
|
|
4162
4240
|
@method serializePolymorphicType
|
4163
|
-
@param {DS.
|
4241
|
+
@param {DS.Snapshot} snapshot
|
4164
4242
|
@param {Object} json
|
4165
4243
|
@param {Object} relationship
|
4166
4244
|
*/
|
4167
|
-
serializePolymorphicType: function(
|
4245
|
+
serializePolymorphicType: function(snapshot, json, relationship) {
|
4168
4246
|
var key = relationship.key;
|
4169
|
-
var belongsTo =
|
4247
|
+
var belongsTo = snapshot.belongsTo(key);
|
4170
4248
|
var jsonKey = activemodel$adapter$lib$system$active_model_serializer$$underscore(key + "_type");
|
4171
4249
|
|
4172
4250
|
if (Ember.isNone(belongsTo)) {
|
4173
4251
|
json[jsonKey] = null;
|
4174
4252
|
} else {
|
4175
|
-
json[jsonKey] = activemodel$adapter$lib$system$active_model_serializer$$capitalize(activemodel$adapter$lib$system$active_model_serializer$$camelize(belongsTo.
|
4253
|
+
json[jsonKey] = activemodel$adapter$lib$system$active_model_serializer$$capitalize(activemodel$adapter$lib$system$active_model_serializer$$camelize(belongsTo.typeKey));
|
4176
4254
|
}
|
4177
4255
|
},
|
4178
4256
|
|
@@ -4225,7 +4303,7 @@
|
|
4225
4303
|
@param {Object} data
|
4226
4304
|
*/
|
4227
4305
|
|
4228
|
-
normalizeLinks: function(data){
|
4306
|
+
normalizeLinks: function(data) {
|
4229
4307
|
if (data.links) {
|
4230
4308
|
var links = data.links;
|
4231
4309
|
|
@@ -4303,18 +4381,20 @@
|
|
4303
4381
|
@namespace DS
|
4304
4382
|
@private
|
4305
4383
|
*/
|
4306
|
-
function ember$data$lib$system$container_proxy$$ContainerProxy(container){
|
4384
|
+
function ember$data$lib$system$container_proxy$$ContainerProxy(container) {
|
4307
4385
|
this.container = container;
|
4308
4386
|
}
|
4309
4387
|
|
4310
4388
|
ember$data$lib$system$container_proxy$$ContainerProxy.prototype.aliasedFactory = function(path, preLookup) {
|
4311
4389
|
var _this = this;
|
4312
4390
|
|
4313
|
-
return {
|
4314
|
-
|
4391
|
+
return {
|
4392
|
+
create: function() {
|
4393
|
+
if (preLookup) { preLookup(); }
|
4315
4394
|
|
4316
|
-
|
4317
|
-
|
4395
|
+
return _this.container.lookup(path);
|
4396
|
+
}
|
4397
|
+
};
|
4318
4398
|
};
|
4319
4399
|
|
4320
4400
|
ember$data$lib$system$container_proxy$$ContainerProxy.prototype.registerAlias = function(source, dest, preLookup) {
|
@@ -4324,7 +4404,7 @@
|
|
4324
4404
|
};
|
4325
4405
|
|
4326
4406
|
ember$data$lib$system$container_proxy$$ContainerProxy.prototype.registerDeprecation = function(deprecated, valid) {
|
4327
|
-
var preLookupCallback = function(){
|
4407
|
+
var preLookupCallback = function() {
|
4328
4408
|
Ember.deprecate("You tried to look up '" + deprecated + "', " +
|
4329
4409
|
"but this has been deprecated in favor of '" + valid + "'.", false);
|
4330
4410
|
};
|
@@ -4345,7 +4425,7 @@
|
|
4345
4425
|
};
|
4346
4426
|
|
4347
4427
|
var ember$data$lib$system$container_proxy$$default = ember$data$lib$system$container_proxy$$ContainerProxy;
|
4348
|
-
function activemodel$adapter$lib$setup$container$$setupActiveModelAdapter(container, application){
|
4428
|
+
function activemodel$adapter$lib$setup$container$$setupActiveModelAdapter(container, application) {
|
4349
4429
|
var proxy = new ember$data$lib$system$container_proxy$$default(container);
|
4350
4430
|
proxy.registerDeprecations([
|
4351
4431
|
{ deprecated: 'serializer:_ams', valid: 'serializer:-active-model' },
|
@@ -4370,12 +4450,12 @@
|
|
4370
4450
|
/**
|
4371
4451
|
@property VERSION
|
4372
4452
|
@type String
|
4373
|
-
@default '1.0.0-beta.
|
4453
|
+
@default '1.0.0-beta.15'
|
4374
4454
|
@static
|
4375
4455
|
*/
|
4376
4456
|
/*jshint -W079 */
|
4377
4457
|
var ember$data$lib$core$$DS = Ember.Namespace.create({
|
4378
|
-
VERSION: '1.0.0-beta.
|
4458
|
+
VERSION: '1.0.0-beta.15'
|
4379
4459
|
});
|
4380
4460
|
|
4381
4461
|
if (Ember.libraries) {
|
@@ -4628,22 +4708,26 @@
|
|
4628
4708
|
var content = ember$data$lib$system$record_arrays$record_array$$get(this, 'content');
|
4629
4709
|
if (idx === undefined) {
|
4630
4710
|
content.addObject(record);
|
4631
|
-
} else {
|
4632
|
-
|
4633
|
-
content.insertAt(idx, record);
|
4634
|
-
}
|
4711
|
+
} else if (!content.contains(record)) {
|
4712
|
+
content.insertAt(idx, record);
|
4635
4713
|
}
|
4636
4714
|
},
|
4637
4715
|
|
4716
|
+
_pushRecord: function(record) {
|
4717
|
+
ember$data$lib$system$record_arrays$record_array$$get(this, 'content').pushObject(record);
|
4718
|
+
},
|
4719
|
+
|
4638
4720
|
/**
|
4639
4721
|
Adds a record to the `RecordArray`, but allows duplicates
|
4640
4722
|
|
4723
|
+
@deprecated
|
4641
4724
|
@method pushRecord
|
4642
4725
|
@private
|
4643
4726
|
@param {DS.Model} record
|
4644
4727
|
*/
|
4645
4728
|
pushRecord: function(record) {
|
4646
|
-
|
4729
|
+
Ember.deprecate('Usage of `recordArray.pushRecord` is deprecated, use `recordArray.addObject` instead');
|
4730
|
+
this._pushRecord(record);
|
4647
4731
|
},
|
4648
4732
|
/**
|
4649
4733
|
Removes a record to the `RecordArray`.
|
@@ -4673,10 +4757,11 @@
|
|
4673
4757
|
@return {DS.PromiseArray} promise
|
4674
4758
|
*/
|
4675
4759
|
save: function() {
|
4760
|
+
var recordArray = this;
|
4676
4761
|
var promiseLabel = "DS: RecordArray#save " + ember$data$lib$system$record_arrays$record_array$$get(this, 'type');
|
4677
4762
|
var promise = Ember.RSVP.all(this.invoke("save"), promiseLabel).then(function(array) {
|
4678
|
-
return
|
4679
|
-
}, null, "DS: RecordArray#save
|
4763
|
+
return recordArray;
|
4764
|
+
}, null, "DS: RecordArray#save return RecordArray");
|
4680
4765
|
|
4681
4766
|
return ember$data$lib$system$promise_proxies$$PromiseArray.create({ promise: promise });
|
4682
4767
|
},
|
@@ -4684,7 +4769,7 @@
|
|
4684
4769
|
_dissociateFromOwnRecords: function() {
|
4685
4770
|
var array = this;
|
4686
4771
|
|
4687
|
-
this.forEach(function(record){
|
4772
|
+
this.forEach(function(record) {
|
4688
4773
|
var recordArrays = record._recordArrays;
|
4689
4774
|
|
4690
4775
|
if (recordArrays) {
|
@@ -4697,7 +4782,7 @@
|
|
4697
4782
|
@method _unregisterFromManager
|
4698
4783
|
@private
|
4699
4784
|
*/
|
4700
|
-
_unregisterFromManager: function(){
|
4785
|
+
_unregisterFromManager: function() {
|
4701
4786
|
var manager = ember$data$lib$system$record_arrays$record_array$$get(this, 'manager');
|
4702
4787
|
//We will stop needing this stupid if statement soon, once manyArray are refactored to not be RecordArrays
|
4703
4788
|
if (manager) {
|
@@ -4705,11 +4790,11 @@
|
|
4705
4790
|
}
|
4706
4791
|
},
|
4707
4792
|
|
4708
|
-
willDestroy: function(){
|
4793
|
+
willDestroy: function() {
|
4709
4794
|
this._unregisterFromManager();
|
4710
4795
|
this._dissociateFromOwnRecords();
|
4711
4796
|
ember$data$lib$system$record_arrays$record_array$$set(this, 'content', undefined);
|
4712
|
-
this._super();
|
4797
|
+
this._super.apply(this, arguments);
|
4713
4798
|
}
|
4714
4799
|
});
|
4715
4800
|
|
@@ -4765,8 +4850,7 @@
|
|
4765
4850
|
|
4766
4851
|
updateFilter: Ember.observer(function() {
|
4767
4852
|
Ember.run.once(this, this._updateFilter);
|
4768
|
-
}, 'filterFunction')
|
4769
|
-
|
4853
|
+
}, 'filterFunction')
|
4770
4854
|
});
|
4771
4855
|
|
4772
4856
|
/**
|
@@ -4817,16 +4901,12 @@
|
|
4817
4901
|
}
|
4818
4902
|
});
|
4819
4903
|
|
4820
|
-
|
4821
|
-
|
4822
|
-
*/
|
4823
|
-
|
4824
|
-
var ember$data$lib$system$record_arrays$many_array$$get = Ember.get, ember$data$lib$system$record_arrays$many_array$$set = Ember.set;
|
4904
|
+
var ember$data$lib$system$record_arrays$many_array$$get = Ember.get;
|
4905
|
+
var ember$data$lib$system$record_arrays$many_array$$set = Ember.set;
|
4825
4906
|
|
4826
4907
|
var ember$data$lib$system$record_arrays$many_array$$default = Ember.Object.extend(Ember.MutableArray, Ember.Evented, {
|
4827
4908
|
init: function() {
|
4828
4909
|
this.currentState = Ember.A([]);
|
4829
|
-
this.diff = [];
|
4830
4910
|
},
|
4831
4911
|
|
4832
4912
|
record: null,
|
@@ -4834,8 +4914,6 @@
|
|
4834
4914
|
canonicalState: null,
|
4835
4915
|
currentState: null,
|
4836
4916
|
|
4837
|
-
diff: null,
|
4838
|
-
|
4839
4917
|
length: 0,
|
4840
4918
|
|
4841
4919
|
objectAt: function(index) {
|
@@ -4855,10 +4933,11 @@
|
|
4855
4933
|
return record.get('isNew');
|
4856
4934
|
});
|
4857
4935
|
toSet = toSet.concat(newRecords);
|
4858
|
-
|
4936
|
+
var oldLength = this.length;
|
4937
|
+
this.arrayContentWillChange(0, this.length, toSet.length);
|
4859
4938
|
this.set('length', toSet.length);
|
4860
4939
|
this.currentState = toSet;
|
4861
|
-
this.arrayContentDidChange(0,
|
4940
|
+
this.arrayContentDidChange(0, oldLength, this.length);
|
4862
4941
|
//TODO Figure out to notify only on additions and maybe only if unloaded
|
4863
4942
|
this.relationship.notifyHasManyChanged();
|
4864
4943
|
this.record.updateRecordArrays();
|
@@ -4894,7 +4973,7 @@
|
|
4894
4973
|
this.currentState.splice.apply(this.currentState, [idx, amt].concat(objects));
|
4895
4974
|
this.set('length', this.currentState.length);
|
4896
4975
|
this.arrayContentDidChange(idx, amt, objects.length);
|
4897
|
-
if (objects){
|
4976
|
+
if (objects) {
|
4898
4977
|
//TODO(Igor) probably needed only for unloaded records
|
4899
4978
|
this.relationship.notifyHasManyChanged();
|
4900
4979
|
}
|
@@ -4904,7 +4983,7 @@
|
|
4904
4983
|
//TODO(Igor) optimize
|
4905
4984
|
internalRemoveRecords: function(records) {
|
4906
4985
|
var index;
|
4907
|
-
for(var i=0; i < records.length; i++) {
|
4986
|
+
for (var i=0; i < records.length; i++) {
|
4908
4987
|
index = this.currentState.indexOf(records[i]);
|
4909
4988
|
this.internalReplace(index, 1);
|
4910
4989
|
}
|
@@ -4920,11 +4999,11 @@
|
|
4920
4999
|
|
4921
5000
|
replace: function(idx, amt, objects) {
|
4922
5001
|
var records;
|
4923
|
-
if (amt > 0){
|
5002
|
+
if (amt > 0) {
|
4924
5003
|
records = this.currentState.slice(idx, idx+amt);
|
4925
5004
|
this.get('relationship').removeRecords(records);
|
4926
5005
|
}
|
4927
|
-
if (objects){
|
5006
|
+
if (objects) {
|
4928
5007
|
this.get('relationship').addRecords(objects, idx);
|
4929
5008
|
}
|
4930
5009
|
},
|
@@ -4966,6 +5045,35 @@
|
|
4966
5045
|
return this.relationship.reload();
|
4967
5046
|
},
|
4968
5047
|
|
5048
|
+
/**
|
5049
|
+
Saves all of the records in the `ManyArray`.
|
5050
|
+
|
5051
|
+
Example
|
5052
|
+
|
5053
|
+
```javascript
|
5054
|
+
store.find('inbox', 1).then(function(inbox) {
|
5055
|
+
inbox.get('messages').then(function(messages) {
|
5056
|
+
messages.forEach(function(message) {
|
5057
|
+
message.set('isRead', true);
|
5058
|
+
});
|
5059
|
+
messages.save()
|
5060
|
+
});
|
5061
|
+
});
|
5062
|
+
```
|
5063
|
+
|
5064
|
+
@method save
|
5065
|
+
@return {DS.PromiseArray} promise
|
5066
|
+
*/
|
5067
|
+
save: function() {
|
5068
|
+
var manyArray = this;
|
5069
|
+
var promiseLabel = "DS: ManyArray#save " + ember$data$lib$system$record_arrays$many_array$$get(this, 'type');
|
5070
|
+
var promise = Ember.RSVP.all(this.invoke("save"), promiseLabel).then(function(array) {
|
5071
|
+
return manyArray;
|
5072
|
+
}, null, "DS: ManyArray#save return ManyArray");
|
5073
|
+
|
5074
|
+
return ember$data$lib$system$promise_proxies$$PromiseArray.create({ promise: promise });
|
5075
|
+
},
|
5076
|
+
|
4969
5077
|
/**
|
4970
5078
|
Create a child record within the owner
|
4971
5079
|
|
@@ -4985,6 +5093,26 @@
|
|
4985
5093
|
this.pushObject(record);
|
4986
5094
|
|
4987
5095
|
return record;
|
5096
|
+
},
|
5097
|
+
|
5098
|
+
/**
|
5099
|
+
@method addRecord
|
5100
|
+
@param {DS.Model} record
|
5101
|
+
@deprecated Use `addObject()` instead
|
5102
|
+
*/
|
5103
|
+
addRecord: function(record) {
|
5104
|
+
Ember.deprecate('Using manyArray.addRecord() has been deprecated. You should use manyArray.addObject() instead.');
|
5105
|
+
this.addObject(record);
|
5106
|
+
},
|
5107
|
+
|
5108
|
+
/**
|
5109
|
+
@method removeRecord
|
5110
|
+
@param {DS.Model} record
|
5111
|
+
@deprecated Use `removeObject()` instead
|
5112
|
+
*/
|
5113
|
+
removeRecord: function(record) {
|
5114
|
+
Ember.deprecate('Using manyArray.removeRecord() has been deprecated. You should use manyArray.removeObject() instead.');
|
5115
|
+
this.removeObject(record);
|
4988
5116
|
}
|
4989
5117
|
});
|
4990
5118
|
|
@@ -5042,13 +5170,15 @@
|
|
5042
5170
|
|
5043
5171
|
if (!recordArrays) { return; }
|
5044
5172
|
|
5045
|
-
recordArrays.forEach(function(array){
|
5173
|
+
recordArrays.forEach(function(array) {
|
5046
5174
|
array.removeRecord(record);
|
5047
5175
|
});
|
5048
5176
|
|
5049
5177
|
record._recordArrays = null;
|
5050
5178
|
},
|
5051
5179
|
|
5180
|
+
|
5181
|
+
//Don't need to update non filtered arrays on simple changes
|
5052
5182
|
_recordWasChanged: function (record) {
|
5053
5183
|
var type = record.constructor;
|
5054
5184
|
var recordArrays = this.filteredRecordArrays.get(type);
|
@@ -5056,22 +5186,23 @@
|
|
5056
5186
|
|
5057
5187
|
ember$data$lib$system$record_array_manager$$forEach(recordArrays, function(array) {
|
5058
5188
|
filter = ember$data$lib$system$record_array_manager$$get(array, 'filterFunction');
|
5059
|
-
|
5189
|
+
if (filter) {
|
5190
|
+
this.updateRecordArray(array, filter, type, record);
|
5191
|
+
}
|
5060
5192
|
}, this);
|
5193
|
+
},
|
5061
5194
|
|
5062
|
-
|
5063
|
-
|
5064
|
-
var
|
5065
|
-
|
5066
|
-
|
5067
|
-
for (var i=0, l=manyArrays.length; i<l; i++) {
|
5068
|
-
manyArrays[i].loadedRecord();
|
5069
|
-
}
|
5195
|
+
//Need to update live arrays on loading
|
5196
|
+
recordWasLoaded: function(record) {
|
5197
|
+
var type = record.constructor;
|
5198
|
+
var recordArrays = this.filteredRecordArrays.get(type);
|
5199
|
+
var filter;
|
5070
5200
|
|
5071
|
-
|
5072
|
-
|
5201
|
+
ember$data$lib$system$record_array_manager$$forEach(recordArrays, function(array) {
|
5202
|
+
filter = ember$data$lib$system$record_array_manager$$get(array, 'filterFunction');
|
5203
|
+
this.updateRecordArray(array, filter, type, record);
|
5204
|
+
}, this);
|
5073
5205
|
},
|
5074
|
-
|
5075
5206
|
/**
|
5076
5207
|
Update an individual filter.
|
5077
5208
|
|
@@ -5094,7 +5225,7 @@
|
|
5094
5225
|
|
5095
5226
|
if (shouldBeInArray) {
|
5096
5227
|
if (!recordArrays.has(array)) {
|
5097
|
-
array.
|
5228
|
+
array._pushRecord(record);
|
5098
5229
|
recordArrays.add(array);
|
5099
5230
|
}
|
5100
5231
|
} else if (!shouldBeInArray) {
|
@@ -5117,9 +5248,10 @@
|
|
5117
5248
|
*/
|
5118
5249
|
updateFilter: function(array, type, filter) {
|
5119
5250
|
var typeMap = this.store.typeMapFor(type);
|
5120
|
-
var records = typeMap.records
|
5251
|
+
var records = typeMap.records;
|
5252
|
+
var record;
|
5121
5253
|
|
5122
|
-
for (var i=0, l=records.length; i<l; i++) {
|
5254
|
+
for (var i = 0, l = records.length; i < l; i++) {
|
5123
5255
|
record = records[i];
|
5124
5256
|
|
5125
5257
|
if (!ember$data$lib$system$record_array_manager$$get(record, 'isDeleted') && !ember$data$lib$system$record_array_manager$$get(record, 'isEmpty')) {
|
@@ -5226,36 +5358,16 @@
|
|
5226
5358
|
recordArrays.splice(index, 1);
|
5227
5359
|
},
|
5228
5360
|
|
5229
|
-
|
5230
|
-
|
5231
|
-
// store notifies any interested ManyArrays. When the ManyArray's
|
5232
|
-
// total number of loading records drops to zero, it becomes
|
5233
|
-
// `isLoaded` and fires a `didLoad` event.
|
5234
|
-
registerWaitingRecordArray: function(record, array) {
|
5235
|
-
var loadingRecordArrays = record._loadingRecordArrays || [];
|
5236
|
-
loadingRecordArrays.push(array);
|
5237
|
-
record._loadingRecordArrays = loadingRecordArrays;
|
5238
|
-
},
|
5239
|
-
|
5240
|
-
willDestroy: function(){
|
5241
|
-
this._super();
|
5361
|
+
willDestroy: function() {
|
5362
|
+
this._super.apply(this, arguments);
|
5242
5363
|
|
5243
|
-
|
5364
|
+
this.filteredRecordArrays.forEach(function(value) {
|
5365
|
+
ember$data$lib$system$record_array_manager$$forEach(ember$data$lib$system$record_array_manager$$flatten(value), ember$data$lib$system$record_array_manager$$destroy);
|
5366
|
+
});
|
5244
5367
|
ember$data$lib$system$record_array_manager$$forEach(this._adapterPopulatedRecordArrays, ember$data$lib$system$record_array_manager$$destroy);
|
5245
5368
|
}
|
5246
5369
|
});
|
5247
5370
|
|
5248
|
-
function ember$data$lib$system$record_array_manager$$values(obj) {
|
5249
|
-
var result = [];
|
5250
|
-
var keys = Ember.keys(obj);
|
5251
|
-
|
5252
|
-
for (var i = 0; i < keys.length; i++) {
|
5253
|
-
result.push(obj[keys[i]]);
|
5254
|
-
}
|
5255
|
-
|
5256
|
-
return result;
|
5257
|
-
}
|
5258
|
-
|
5259
5371
|
function ember$data$lib$system$record_array_manager$$destroy(entry) {
|
5260
5372
|
entry.destroy();
|
5261
5373
|
}
|
@@ -5547,6 +5659,7 @@
|
|
5547
5659
|
|
5548
5660
|
rollback: function(record) {
|
5549
5661
|
record.rollback();
|
5662
|
+
record.triggerLater('ready');
|
5550
5663
|
}
|
5551
5664
|
},
|
5552
5665
|
|
@@ -5614,6 +5727,7 @@
|
|
5614
5727
|
|
5615
5728
|
rolledBack: function(record) {
|
5616
5729
|
ember$data$lib$system$model$states$$get(record, 'errors').clear();
|
5730
|
+
record.triggerLater('ready');
|
5617
5731
|
},
|
5618
5732
|
|
5619
5733
|
becameValid: function(record) {
|
@@ -5635,7 +5749,8 @@
|
|
5635
5749
|
// necessary.
|
5636
5750
|
|
5637
5751
|
function ember$data$lib$system$model$states$$deepClone(object) {
|
5638
|
-
var clone = {}
|
5752
|
+
var clone = {};
|
5753
|
+
var value;
|
5639
5754
|
|
5640
5755
|
for (var prop in object) {
|
5641
5756
|
value = object[prop];
|
@@ -5686,6 +5801,11 @@
|
|
5686
5801
|
record.transitionTo('deleted.saved');
|
5687
5802
|
};
|
5688
5803
|
|
5804
|
+
ember$data$lib$system$model$states$$createdState.uncommitted.pushedData = function(record) {
|
5805
|
+
record.transitionTo('loaded.updated.uncommitted');
|
5806
|
+
record.triggerLater('didLoad');
|
5807
|
+
};
|
5808
|
+
|
5689
5809
|
ember$data$lib$system$model$states$$createdState.uncommitted.propertyWasReset = Ember.K;
|
5690
5810
|
|
5691
5811
|
function ember$data$lib$system$model$states$$assertAgainstUnloadRecord(record) {
|
@@ -5745,11 +5865,13 @@
|
|
5745
5865
|
|
5746
5866
|
loadedData: function(record) {
|
5747
5867
|
record.transitionTo('loaded.created.uncommitted');
|
5868
|
+
record.triggerLater('ready');
|
5748
5869
|
},
|
5749
5870
|
|
5750
5871
|
pushedData: function(record) {
|
5751
5872
|
record.transitionTo('loaded.saved');
|
5752
5873
|
record.triggerLater('didLoad');
|
5874
|
+
record.triggerLater('ready');
|
5753
5875
|
}
|
5754
5876
|
},
|
5755
5877
|
|
@@ -5771,6 +5893,7 @@
|
|
5771
5893
|
pushedData: function(record) {
|
5772
5894
|
record.transitionTo('loaded.saved');
|
5773
5895
|
record.triggerLater('didLoad');
|
5896
|
+
record.triggerLater('ready');
|
5774
5897
|
ember$data$lib$system$model$states$$set(record, 'isError', false);
|
5775
5898
|
},
|
5776
5899
|
|
@@ -5890,6 +6013,7 @@
|
|
5890
6013
|
|
5891
6014
|
rollback: function(record) {
|
5892
6015
|
record.rollback();
|
6016
|
+
record.triggerLater('ready');
|
5893
6017
|
},
|
5894
6018
|
|
5895
6019
|
becomeDirty: Ember.K,
|
@@ -5897,6 +6021,7 @@
|
|
5897
6021
|
|
5898
6022
|
rolledBack: function(record) {
|
5899
6023
|
record.transitionTo('loaded.saved');
|
6024
|
+
record.triggerLater('ready');
|
5900
6025
|
}
|
5901
6026
|
},
|
5902
6027
|
|
@@ -5935,7 +6060,7 @@
|
|
5935
6060
|
|
5936
6061
|
setup: function(record) {
|
5937
6062
|
var store = ember$data$lib$system$model$states$$get(record, 'store');
|
5938
|
-
store.
|
6063
|
+
store._dematerializeRecord(record);
|
5939
6064
|
},
|
5940
6065
|
|
5941
6066
|
invokeLifecycleCallbacks: function(record) {
|
@@ -6052,7 +6177,7 @@
|
|
6052
6177
|
record. This is useful for displaying all errors to the user.
|
6053
6178
|
|
6054
6179
|
```handlebars
|
6055
|
-
{{#each message in errors.messages}}
|
6180
|
+
{{#each message in model.errors.messages}}
|
6056
6181
|
<div class="error">
|
6057
6182
|
{{message}}
|
6058
6183
|
</div>
|
@@ -6292,34 +6417,34 @@
|
|
6292
6417
|
var members = this.members.list;
|
6293
6418
|
var member;
|
6294
6419
|
|
6295
|
-
while (members.length > 0){
|
6420
|
+
while (members.length > 0) {
|
6296
6421
|
member = members[0];
|
6297
6422
|
this.removeRecord(member);
|
6298
6423
|
}
|
6299
6424
|
},
|
6300
6425
|
|
6301
|
-
disconnect: function(){
|
6426
|
+
disconnect: function() {
|
6302
6427
|
this.members.forEach(function(member) {
|
6303
6428
|
this.removeRecordFromInverse(member);
|
6304
6429
|
}, this);
|
6305
6430
|
},
|
6306
6431
|
|
6307
|
-
reconnect: function(){
|
6432
|
+
reconnect: function() {
|
6308
6433
|
this.members.forEach(function(member) {
|
6309
6434
|
this.addRecordToInverse(member);
|
6310
6435
|
}, this);
|
6311
6436
|
},
|
6312
6437
|
|
6313
|
-
removeRecords: function(records){
|
6438
|
+
removeRecords: function(records) {
|
6314
6439
|
var self = this;
|
6315
|
-
ember$data$lib$system$relationships$state$relationship$$forEach(records, function(record){
|
6440
|
+
ember$data$lib$system$relationships$state$relationship$$forEach(records, function(record) {
|
6316
6441
|
self.removeRecord(record);
|
6317
6442
|
});
|
6318
6443
|
},
|
6319
6444
|
|
6320
|
-
addRecords: function(records, idx){
|
6445
|
+
addRecords: function(records, idx) {
|
6321
6446
|
var self = this;
|
6322
|
-
ember$data$lib$system$relationships$state$relationship$$forEach(records, function(record){
|
6447
|
+
ember$data$lib$system$relationships$state$relationship$$forEach(records, function(record) {
|
6323
6448
|
self.addRecord(record, idx);
|
6324
6449
|
if (idx !== undefined) {
|
6325
6450
|
idx++;
|
@@ -6344,7 +6469,7 @@
|
|
6344
6469
|
record._relationships[this.inverseKey].addCanonicalRecord(this.record);
|
6345
6470
|
} else {
|
6346
6471
|
if (!record._implicitRelationships[this.inverseKeyForImplicit]) {
|
6347
|
-
record._implicitRelationships[this.inverseKeyForImplicit] = new ember$data$lib$system$relationships$state$relationship$$Relationship(this.store, record, this.key, {options:{}});
|
6472
|
+
record._implicitRelationships[this.inverseKeyForImplicit] = new ember$data$lib$system$relationships$state$relationship$$Relationship(this.store, record, this.key, { options: {} });
|
6348
6473
|
}
|
6349
6474
|
record._implicitRelationships[this.inverseKeyForImplicit].addCanonicalRecord(this.record);
|
6350
6475
|
}
|
@@ -6384,11 +6509,11 @@
|
|
6384
6509
|
record._relationships[this.inverseKey].addRecord(this.record);
|
6385
6510
|
} else {
|
6386
6511
|
if (!record._implicitRelationships[this.inverseKeyForImplicit]) {
|
6387
|
-
record._implicitRelationships[this.inverseKeyForImplicit] = new ember$data$lib$system$relationships$state$relationship$$Relationship(this.store, record, this.key, {options:{}});
|
6512
|
+
record._implicitRelationships[this.inverseKeyForImplicit] = new ember$data$lib$system$relationships$state$relationship$$Relationship(this.store, record, this.key, { options: {} });
|
6388
6513
|
}
|
6389
6514
|
record._implicitRelationships[this.inverseKeyForImplicit].addRecord(this.record);
|
6390
6515
|
}
|
6391
|
-
this.record.
|
6516
|
+
this.record.updateRecordArraysLater();
|
6392
6517
|
}
|
6393
6518
|
},
|
6394
6519
|
|
@@ -6467,7 +6592,7 @@
|
|
6467
6592
|
},
|
6468
6593
|
|
6469
6594
|
updateLink: function(link) {
|
6470
|
-
Ember.warn("You have pushed a record of type '" + this.record.constructor.typeKey + "' with '" + this.key + "' as a link, but the association is not an
|
6595
|
+
Ember.warn("You have pushed a record of type '" + this.record.constructor.typeKey + "' with '" + this.key + "' as a link, but the association is not an async relationship.", this.isAsync);
|
6471
6596
|
Ember.assert("You have pushed a record of type '" + this.record.constructor.typeKey + "' with '" + this.key + "' as a link, but the value of that link is not a string.", typeof link === 'string' || link === null);
|
6472
6597
|
if (link !== this.link) {
|
6473
6598
|
this.link = link;
|
@@ -6508,7 +6633,13 @@
|
|
6508
6633
|
this._super$constructor(store, record, inverseKey, relationshipMeta);
|
6509
6634
|
this.belongsToType = relationshipMeta.type;
|
6510
6635
|
this.canonicalState = [];
|
6511
|
-
this.manyArray = ember$data$lib$system$record_arrays$many_array$$default.create({
|
6636
|
+
this.manyArray = ember$data$lib$system$record_arrays$many_array$$default.create({
|
6637
|
+
canonicalState: this.canonicalState,
|
6638
|
+
store: this.store,
|
6639
|
+
relationship: this,
|
6640
|
+
type: this.belongsToType,
|
6641
|
+
record: record
|
6642
|
+
});
|
6512
6643
|
this.isPolymorphic = relationshipMeta.options.polymorphic;
|
6513
6644
|
this.manyArray.isPolymorphic = this.isPolymorphic;
|
6514
6645
|
};
|
@@ -6616,27 +6747,21 @@
|
|
6616
6747
|
records = ember$data$lib$system$relationships$state$has_many$$setForArray(records);
|
6617
6748
|
|
6618
6749
|
members.forEach(function(member) {
|
6619
|
-
if (records.has(member)) return;
|
6750
|
+
if (records.has(member)) { return; }
|
6620
6751
|
|
6621
6752
|
recordsToRemove.push(member);
|
6622
6753
|
});
|
6623
6754
|
|
6624
6755
|
this.removeCanonicalRecords(recordsToRemove);
|
6625
6756
|
|
6626
|
-
var hasManyArray = this.manyArray;
|
6627
|
-
|
6628
6757
|
// Using records.toArray() since currently using
|
6629
6758
|
// removeRecord can modify length, messing stuff up
|
6630
6759
|
// forEach since it directly looks at "length" each
|
6631
6760
|
// iteration
|
6632
6761
|
records = records.toArray();
|
6633
6762
|
length = records.length;
|
6634
|
-
for (i = 0; i < length; i++){
|
6763
|
+
for (i = 0; i < length; i++) {
|
6635
6764
|
record = records[i];
|
6636
|
-
//Need to preserve the order of incoming records
|
6637
|
-
if (hasManyArray.objectAt(i) === record ) {
|
6638
|
-
continue;
|
6639
|
-
}
|
6640
6765
|
this.removeCanonicalRecord(record);
|
6641
6766
|
this.addCanonicalRecord(record, i);
|
6642
6767
|
}
|
@@ -6644,7 +6769,7 @@
|
|
6644
6769
|
|
6645
6770
|
ember$data$lib$system$relationships$state$has_many$$ManyRelationship.prototype.fetchLink = function() {
|
6646
6771
|
var self = this;
|
6647
|
-
return this.store.findHasMany(this.record, this.link, this.relationshipMeta).then(function(records){
|
6772
|
+
return this.store.findHasMany(this.record, this.link, this.relationshipMeta).then(function(records) {
|
6648
6773
|
self.updateRecordsFromAdapter(records);
|
6649
6774
|
return self.manyArray;
|
6650
6775
|
});
|
@@ -6652,7 +6777,7 @@
|
|
6652
6777
|
|
6653
6778
|
ember$data$lib$system$relationships$state$has_many$$ManyRelationship.prototype.findRecords = function() {
|
6654
6779
|
var manyArray = this.manyArray;
|
6655
|
-
return this.store.findMany(manyArray.toArray()).then(function(){
|
6780
|
+
return this.store.findMany(manyArray.toArray()).then(function() {
|
6656
6781
|
//Goes away after the manyArray refactor
|
6657
6782
|
manyArray.set('isLoaded', true);
|
6658
6783
|
return manyArray;
|
@@ -6679,14 +6804,14 @@
|
|
6679
6804
|
promise: promise
|
6680
6805
|
});
|
6681
6806
|
} else {
|
6682
|
-
|
6807
|
+
Ember.assert("You looked up the '" + this.key + "' relationship on a '" + this.record.constructor.typeKey + "' with id " + this.record.get('id') + " but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.hasMany({ async: true })`)", this.manyArray.isEvery('isEmpty', false));
|
6683
6808
|
|
6684
6809
|
//TODO(Igor) WTF DO I DO HERE?
|
6685
6810
|
if (!this.manyArray.get('isDestroyed')) {
|
6686
6811
|
this.manyArray.set('isLoaded', true);
|
6687
6812
|
}
|
6688
6813
|
return this.manyArray;
|
6689
|
-
|
6814
|
+
}
|
6690
6815
|
};
|
6691
6816
|
|
6692
6817
|
function ember$data$lib$system$relationships$state$has_many$$setForArray(array) {
|
@@ -6733,9 +6858,7 @@
|
|
6733
6858
|
|
6734
6859
|
ember$data$lib$system$relationships$state$belongs_to$$BelongsToRelationship.prototype._super$addCanonicalRecord = ember$data$lib$system$relationships$state$relationship$$default.prototype.addCanonicalRecord;
|
6735
6860
|
ember$data$lib$system$relationships$state$belongs_to$$BelongsToRelationship.prototype.addCanonicalRecord = function(newRecord) {
|
6736
|
-
if (this.canonicalMembers.has(newRecord)){ return;}
|
6737
|
-
var type = this.relationshipMeta.type;
|
6738
|
-
Ember.assert("You can only add a '" + type.typeKey + "' record to this relationship", newRecord instanceof type);
|
6861
|
+
if (this.canonicalMembers.has(newRecord)) { return;}
|
6739
6862
|
|
6740
6863
|
if (this.canonicalState) {
|
6741
6864
|
this.removeCanonicalRecord(this.canonicalState);
|
@@ -6759,7 +6882,7 @@
|
|
6759
6882
|
|
6760
6883
|
ember$data$lib$system$relationships$state$belongs_to$$BelongsToRelationship.prototype._super$addRecord = ember$data$lib$system$relationships$state$relationship$$default.prototype.addRecord;
|
6761
6884
|
ember$data$lib$system$relationships$state$belongs_to$$BelongsToRelationship.prototype.addRecord = function(newRecord) {
|
6762
|
-
if (this.members.has(newRecord)){ return;}
|
6885
|
+
if (this.members.has(newRecord)) { return;}
|
6763
6886
|
var type = this.relationshipMeta.type;
|
6764
6887
|
Ember.assert("You can only add a '" + type.typeKey + "' record to this relationship", (function () {
|
6765
6888
|
if (newRecord instanceof type) {
|
@@ -6788,7 +6911,7 @@
|
|
6788
6911
|
|
6789
6912
|
ember$data$lib$system$relationships$state$belongs_to$$BelongsToRelationship.prototype._super$removeRecordFromOwn = ember$data$lib$system$relationships$state$relationship$$default.prototype.removeRecordFromOwn;
|
6790
6913
|
ember$data$lib$system$relationships$state$belongs_to$$BelongsToRelationship.prototype.removeRecordFromOwn = function(record) {
|
6791
|
-
if (!this.members.has(record)){ return;}
|
6914
|
+
if (!this.members.has(record)) { return;}
|
6792
6915
|
this.inverseRecord = null;
|
6793
6916
|
this._super$removeRecordFromOwn(record);
|
6794
6917
|
this.record.notifyBelongsToChanged(this.key);
|
@@ -6796,7 +6919,7 @@
|
|
6796
6919
|
|
6797
6920
|
ember$data$lib$system$relationships$state$belongs_to$$BelongsToRelationship.prototype._super$removeCanonicalRecordFromOwn = ember$data$lib$system$relationships$state$relationship$$default.prototype.removeCanonicalRecordFromOwn;
|
6798
6921
|
ember$data$lib$system$relationships$state$belongs_to$$BelongsToRelationship.prototype.removeCanonicalRecordFromOwn = function(record) {
|
6799
|
-
if (!this.canonicalMembers.has(record)){ return;}
|
6922
|
+
if (!this.canonicalMembers.has(record)) { return;}
|
6800
6923
|
this.canonicalState = null;
|
6801
6924
|
this._super$removeCanonicalRecordFromOwn(record);
|
6802
6925
|
};
|
@@ -6811,7 +6934,7 @@
|
|
6811
6934
|
|
6812
6935
|
ember$data$lib$system$relationships$state$belongs_to$$BelongsToRelationship.prototype.fetchLink = function() {
|
6813
6936
|
var self = this;
|
6814
|
-
return this.store.findBelongsTo(this.record, this.link, this.relationshipMeta).then(function(record){
|
6937
|
+
return this.store.findBelongsTo(this.record, this.link, this.relationshipMeta).then(function(record) {
|
6815
6938
|
if (record) {
|
6816
6939
|
self.addRecord(record);
|
6817
6940
|
}
|
@@ -6823,7 +6946,7 @@
|
|
6823
6946
|
//TODO(Igor) flushCanonical here once our syncing is not stupid
|
6824
6947
|
if (this.isAsync) {
|
6825
6948
|
var promise;
|
6826
|
-
if (this.link){
|
6949
|
+
if (this.link) {
|
6827
6950
|
var self = this;
|
6828
6951
|
promise = this.findLink().then(function() {
|
6829
6952
|
return self.findRecord();
|
@@ -6849,41 +6972,401 @@
|
|
6849
6972
|
var inverse = record.constructor.inverseFor(relationshipMeta.key);
|
6850
6973
|
|
6851
6974
|
if (inverse) {
|
6852
|
-
|
6853
|
-
}
|
6854
|
-
|
6855
|
-
if (relationshipMeta.kind === 'hasMany'){
|
6856
|
-
return new ember$data$lib$system$relationships$state$has_many$$default(store, record, inverseKey, relationshipMeta);
|
6975
|
+
inverseKey = inverse.name;
|
6857
6976
|
}
|
6858
|
-
|
6859
|
-
|
6977
|
+
|
6978
|
+
if (relationshipMeta.kind === 'hasMany') {
|
6979
|
+
return new ember$data$lib$system$relationships$state$has_many$$default(store, record, inverseKey, relationshipMeta);
|
6980
|
+
} else {
|
6981
|
+
return new ember$data$lib$system$relationships$state$belongs_to$$default(store, record, inverseKey, relationshipMeta);
|
6860
6982
|
}
|
6861
6983
|
};
|
6862
6984
|
|
6863
6985
|
var ember$data$lib$system$relationships$state$create$$default = ember$data$lib$system$relationships$state$create$$createRelationshipFor;
|
6864
|
-
|
6865
6986
|
/**
|
6866
6987
|
@module ember-data
|
6867
6988
|
*/
|
6868
6989
|
|
6869
|
-
var ember$data$lib$system$
|
6870
|
-
var ember$data$lib$system$model$model$$set = Ember.set;
|
6871
|
-
var ember$data$lib$system$model$model$$Promise = Ember.RSVP.Promise;
|
6872
|
-
var ember$data$lib$system$model$model$$forEach = Ember.ArrayPolyfills.forEach;
|
6873
|
-
var ember$data$lib$system$model$model$$map = Ember.ArrayPolyfills.map;
|
6874
|
-
|
6875
|
-
var ember$data$lib$system$model$model$$retrieveFromCurrentState = Ember.computed('currentState', function(key, value) {
|
6876
|
-
return ember$data$lib$system$model$model$$get(ember$data$lib$system$model$model$$get(this, 'currentState'), key);
|
6877
|
-
}).readOnly();
|
6990
|
+
var ember$data$lib$system$snapshot$$get = Ember.get;
|
6878
6991
|
|
6879
|
-
|
6880
|
-
|
6992
|
+
/**
|
6993
|
+
@class Snapshot
|
6994
|
+
@namespace DS
|
6995
|
+
@private
|
6996
|
+
@constructor
|
6997
|
+
@param {DS.Model} record The record to create a snapshot from
|
6998
|
+
*/
|
6999
|
+
function ember$data$lib$system$snapshot$$Snapshot(record) {
|
7000
|
+
this._attributes = Ember.create(null);
|
7001
|
+
this._belongsToRelationships = Ember.create(null);
|
7002
|
+
this._belongsToIds = Ember.create(null);
|
7003
|
+
this._hasManyRelationships = Ember.create(null);
|
7004
|
+
this._hasManyIds = Ember.create(null);
|
7005
|
+
|
7006
|
+
record.eachAttribute(function(keyName) {
|
7007
|
+
this._attributes[keyName] = ember$data$lib$system$snapshot$$get(record, keyName);
|
7008
|
+
}, this);
|
7009
|
+
|
7010
|
+
this.id = ember$data$lib$system$snapshot$$get(record, 'id');
|
7011
|
+
this.record = record;
|
7012
|
+
this.type = record.constructor;
|
7013
|
+
this.typeKey = record.constructor.typeKey;
|
6881
7014
|
|
6882
|
-
|
6883
|
-
|
6884
|
-
|
6885
|
-
|
6886
|
-
|
7015
|
+
// The following code is here to keep backwards compatibility when accessing
|
7016
|
+
// `constructor` directly.
|
7017
|
+
//
|
7018
|
+
// With snapshots you should use `type` instead of `constructor`.
|
7019
|
+
//
|
7020
|
+
// Remove for Ember Data 1.0.
|
7021
|
+
if (Ember.platform.hasPropertyAccessors) {
|
7022
|
+
var callDeprecate = true;
|
7023
|
+
|
7024
|
+
Ember.defineProperty(this, 'constructor', {
|
7025
|
+
get: function() {
|
7026
|
+
// Ugly hack since accessing error.stack (done in `Ember.deprecate()`)
|
7027
|
+
// causes the internals of Chrome to access the constructor, which then
|
7028
|
+
// causes an infinite loop if accessed and calls `Ember.deprecate()`
|
7029
|
+
// again.
|
7030
|
+
if (callDeprecate) {
|
7031
|
+
callDeprecate = false;
|
7032
|
+
Ember.deprecate('Usage of `snapshot.constructor` is deprecated, use `snapshot.type` instead.');
|
7033
|
+
callDeprecate = true;
|
7034
|
+
}
|
7035
|
+
|
7036
|
+
return this.type;
|
7037
|
+
}
|
7038
|
+
});
|
7039
|
+
} else {
|
7040
|
+
this.constructor = this.type;
|
7041
|
+
}
|
7042
|
+
}
|
7043
|
+
|
7044
|
+
ember$data$lib$system$snapshot$$Snapshot.prototype = {
|
7045
|
+
constructor: ember$data$lib$system$snapshot$$Snapshot,
|
7046
|
+
|
7047
|
+
/**
|
7048
|
+
The id of the snapshot's underlying record
|
7049
|
+
|
7050
|
+
Example
|
7051
|
+
|
7052
|
+
```javascript
|
7053
|
+
var post = store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });
|
7054
|
+
var snapshot = post._createSnapshot();
|
7055
|
+
|
7056
|
+
snapshot.id; // => '1'
|
7057
|
+
```
|
7058
|
+
|
7059
|
+
@property id
|
7060
|
+
@type {String}
|
7061
|
+
*/
|
7062
|
+
id: null,
|
7063
|
+
|
7064
|
+
/**
|
7065
|
+
The underlying record for this snapshot. Can be used to access methods and
|
7066
|
+
properties defined on the record.
|
7067
|
+
|
7068
|
+
Example
|
7069
|
+
|
7070
|
+
```javascript
|
7071
|
+
var json = snapshot.record.toJSON();
|
7072
|
+
```
|
7073
|
+
|
7074
|
+
@property record
|
7075
|
+
@type {DS.Model}
|
7076
|
+
*/
|
7077
|
+
record: null,
|
7078
|
+
|
7079
|
+
/**
|
7080
|
+
The type of the underlying record for this snapshot, as a subclass of DS.Model.
|
7081
|
+
|
7082
|
+
@property type
|
7083
|
+
@type {subclass of DS.Model}
|
7084
|
+
*/
|
7085
|
+
type: null,
|
7086
|
+
|
7087
|
+
/**
|
7088
|
+
The name of the type of the underlying record for this snapshot, as a string.
|
7089
|
+
|
7090
|
+
@property typeKey
|
7091
|
+
@type {String}
|
7092
|
+
*/
|
7093
|
+
typeKey: null,
|
7094
|
+
|
7095
|
+
/**
|
7096
|
+
Returns the value of an attribute.
|
7097
|
+
|
7098
|
+
Example
|
7099
|
+
|
7100
|
+
```javascript
|
7101
|
+
var post = store.createRecord('post', { author: 'Tomster', title: 'Ember.js rocks' });
|
7102
|
+
var snapshot = post._createSnapshot();
|
7103
|
+
|
7104
|
+
snapshot.attr('author'); // => 'Tomster'
|
7105
|
+
snapshot.attr('title'); // => 'Ember.js rocks'
|
7106
|
+
```
|
7107
|
+
|
7108
|
+
Note: Values are loaded eagerly and cached when the snapshot is created.
|
7109
|
+
|
7110
|
+
@method attr
|
7111
|
+
@param {String} keyName
|
7112
|
+
@return {Object} The attribute value or undefined
|
7113
|
+
*/
|
7114
|
+
attr: function(keyName) {
|
7115
|
+
if (keyName in this._attributes) {
|
7116
|
+
return this._attributes[keyName];
|
7117
|
+
}
|
7118
|
+
throw new Ember.Error("Model '" + Ember.inspect(this.record) + "' has no attribute named '" + keyName + "' defined.");
|
7119
|
+
},
|
7120
|
+
|
7121
|
+
/**
|
7122
|
+
Returns all attributes and their corresponding values.
|
7123
|
+
|
7124
|
+
Example
|
7125
|
+
|
7126
|
+
```javascript
|
7127
|
+
var post = store.createRecord('post', { author: 'Tomster', title: 'Ember.js rocks' });
|
7128
|
+
var snapshot = post._createSnapshot();
|
7129
|
+
|
7130
|
+
snapshot.attributes(); // => { author: 'Tomster', title: 'Ember.js rocks' }
|
7131
|
+
```
|
7132
|
+
|
7133
|
+
@method attributes
|
7134
|
+
@return {Array} All attributes for the current snapshot
|
7135
|
+
*/
|
7136
|
+
attributes: function() {
|
7137
|
+
return Ember.copy(this._attributes);
|
7138
|
+
},
|
7139
|
+
|
7140
|
+
/**
|
7141
|
+
Returns the current value of a belongsTo relationship.
|
7142
|
+
|
7143
|
+
`belongsTo` takes an optional hash of options as a second parameter,
|
7144
|
+
currently supported options are:
|
7145
|
+
|
7146
|
+
- `id`: set to `true` if you only want the ID of the related record to be
|
7147
|
+
returned.
|
7148
|
+
|
7149
|
+
Example
|
7150
|
+
|
7151
|
+
```javascript
|
7152
|
+
var post = store.push('post', { id: 1, title: 'Hello World' });
|
7153
|
+
var comment = store.createRecord('comment', { body: 'Lorem ipsum', post: post });
|
7154
|
+
var snapshot = comment._createSnapshot();
|
7155
|
+
|
7156
|
+
snapshot.belongsTo('post'); // => DS.Snapshot of post
|
7157
|
+
snapshot.belongsTo('post', { id: true }); // => '1'
|
7158
|
+
```
|
7159
|
+
|
7160
|
+
Calling `belongsTo` will return a new Snapshot as long as there's any
|
7161
|
+
data available, such as an ID. If there's no data available `belongsTo` will
|
7162
|
+
return undefined.
|
7163
|
+
|
7164
|
+
Note: Relationships are loaded lazily and cached upon first access.
|
7165
|
+
|
7166
|
+
@method belongsTo
|
7167
|
+
@param {String} keyName
|
7168
|
+
@param {Object} [options]
|
7169
|
+
@return {DS.Snapshot|String|undefined} A snapshot or ID of a belongsTo relationship, or undefined
|
7170
|
+
*/
|
7171
|
+
belongsTo: function(keyName, options) {
|
7172
|
+
var id = options && options.id;
|
7173
|
+
var result;
|
7174
|
+
var relationship, inverseRecord;
|
7175
|
+
|
7176
|
+
if (id && keyName in this._belongsToIds) {
|
7177
|
+
return this._belongsToIds[keyName];
|
7178
|
+
}
|
7179
|
+
|
7180
|
+
if (!id && keyName in this._belongsToRelationships) {
|
7181
|
+
return this._belongsToRelationships[keyName];
|
7182
|
+
}
|
7183
|
+
|
7184
|
+
relationship = this.record._relationships[keyName];
|
7185
|
+
if (!(relationship && relationship.relationshipMeta.kind === 'belongsTo')) {
|
7186
|
+
throw new Ember.Error("Model '" + Ember.inspect(this.record) + "' has no belongsTo relationship named '" + keyName + "' defined.");
|
7187
|
+
}
|
7188
|
+
|
7189
|
+
inverseRecord = ember$data$lib$system$snapshot$$get(relationship, 'inverseRecord');
|
7190
|
+
if (id) {
|
7191
|
+
if (inverseRecord) {
|
7192
|
+
result = ember$data$lib$system$snapshot$$get(inverseRecord, 'id');
|
7193
|
+
}
|
7194
|
+
this._belongsToIds[keyName] = result;
|
7195
|
+
} else {
|
7196
|
+
if (inverseRecord) {
|
7197
|
+
result = inverseRecord._createSnapshot();
|
7198
|
+
}
|
7199
|
+
this._belongsToRelationships[keyName] = result;
|
7200
|
+
}
|
7201
|
+
|
7202
|
+
return result;
|
7203
|
+
},
|
7204
|
+
|
7205
|
+
/**
|
7206
|
+
Returns the current value of a hasMany relationship.
|
7207
|
+
|
7208
|
+
`hasMany` takes an optional hash of options as a second parameter,
|
7209
|
+
currently supported options are:
|
7210
|
+
|
7211
|
+
- `ids`: set to `true` if you only want the IDs of the related records to be
|
7212
|
+
returned.
|
7213
|
+
|
7214
|
+
Example
|
7215
|
+
|
7216
|
+
```javascript
|
7217
|
+
var post = store.createRecord('post', { title: 'Hello World', comments: [2, 3] });
|
7218
|
+
var snapshot = post._createSnapshot();
|
7219
|
+
|
7220
|
+
snapshot.hasMany('comments'); // => [DS.Snapshot, DS.Snapshot]
|
7221
|
+
snapshot.hasMany('comments', { ids: true }); // => ['2', '3']
|
7222
|
+
```
|
7223
|
+
|
7224
|
+
Note: Relationships are loaded lazily and cached upon first access.
|
7225
|
+
|
7226
|
+
@method hasMany
|
7227
|
+
@param {String} keyName
|
7228
|
+
@param {Object} [options]
|
7229
|
+
@return {Array} An array of snapshots or IDs of a hasMany relationship
|
7230
|
+
*/
|
7231
|
+
hasMany: function(keyName, options) {
|
7232
|
+
var ids = options && options.ids;
|
7233
|
+
var results = [];
|
7234
|
+
var relationship, members;
|
7235
|
+
|
7236
|
+
if (ids && keyName in this._hasManyIds) {
|
7237
|
+
return this._hasManyIds[keyName];
|
7238
|
+
}
|
7239
|
+
|
7240
|
+
if (!ids && keyName in this._hasManyRelationships) {
|
7241
|
+
return this._hasManyRelationships[keyName];
|
7242
|
+
}
|
7243
|
+
|
7244
|
+
relationship = this.record._relationships[keyName];
|
7245
|
+
if (!(relationship && relationship.relationshipMeta.kind === 'hasMany')) {
|
7246
|
+
throw new Ember.Error("Model '" + Ember.inspect(this.record) + "' has no hasMany relationship named '" + keyName + "' defined.");
|
7247
|
+
}
|
7248
|
+
|
7249
|
+
members = ember$data$lib$system$snapshot$$get(relationship, 'members');
|
7250
|
+
|
7251
|
+
if (ids) {
|
7252
|
+
members.forEach(function(member) {
|
7253
|
+
results.push(ember$data$lib$system$snapshot$$get(member, 'id'));
|
7254
|
+
});
|
7255
|
+
this._hasManyIds[keyName] = results;
|
7256
|
+
} else {
|
7257
|
+
members.forEach(function(member) {
|
7258
|
+
results.push(member._createSnapshot());
|
7259
|
+
});
|
7260
|
+
this._hasManyRelationships[keyName] = results;
|
7261
|
+
}
|
7262
|
+
|
7263
|
+
return results;
|
7264
|
+
},
|
7265
|
+
|
7266
|
+
/**
|
7267
|
+
Iterates through all the attributes of the model, calling the passed
|
7268
|
+
function on each attribute.
|
7269
|
+
|
7270
|
+
Example
|
7271
|
+
|
7272
|
+
```javascript
|
7273
|
+
snapshot.eachAttribute(function(name, meta) {
|
7274
|
+
// ...
|
7275
|
+
});
|
7276
|
+
```
|
7277
|
+
|
7278
|
+
@method eachAttribute
|
7279
|
+
@param {Function} callback the callback to execute
|
7280
|
+
@param {Object} [binding] the value to which the callback's `this` should be bound
|
7281
|
+
*/
|
7282
|
+
eachAttribute: function(callback, binding) {
|
7283
|
+
this.record.eachAttribute(callback, binding);
|
7284
|
+
},
|
7285
|
+
|
7286
|
+
/**
|
7287
|
+
Iterates through all the relationships of the model, calling the passed
|
7288
|
+
function on each relationship.
|
7289
|
+
|
7290
|
+
Example
|
7291
|
+
|
7292
|
+
```javascript
|
7293
|
+
snapshot.eachRelationship(function(name, relationship) {
|
7294
|
+
// ...
|
7295
|
+
});
|
7296
|
+
```
|
7297
|
+
|
7298
|
+
@method eachRelationship
|
7299
|
+
@param {Function} callback the callback to execute
|
7300
|
+
@param {Object} [binding] the value to which the callback's `this` should be bound
|
7301
|
+
*/
|
7302
|
+
eachRelationship: function(callback, binding) {
|
7303
|
+
this.record.eachRelationship(callback, binding);
|
7304
|
+
},
|
7305
|
+
|
7306
|
+
/**
|
7307
|
+
@method get
|
7308
|
+
@param {String} keyName
|
7309
|
+
@return {Object} The property value
|
7310
|
+
@deprecated Use [attr](#method_attr), [belongsTo](#method_belongsTo) or [hasMany](#method_hasMany) instead
|
7311
|
+
*/
|
7312
|
+
get: function(keyName) {
|
7313
|
+
Ember.deprecate('Using DS.Snapshot.get() is deprecated. Use .attr(), .belongsTo() or .hasMany() instead.');
|
7314
|
+
|
7315
|
+
if (keyName === 'id') {
|
7316
|
+
return this.id;
|
7317
|
+
}
|
7318
|
+
|
7319
|
+
if (keyName in this._attributes) {
|
7320
|
+
return this.attr(keyName);
|
7321
|
+
}
|
7322
|
+
|
7323
|
+
var relationship = this.record._relationships[keyName];
|
7324
|
+
|
7325
|
+
if (relationship && relationship.relationshipMeta.kind === 'belongsTo') {
|
7326
|
+
return this.belongsTo(keyName);
|
7327
|
+
}
|
7328
|
+
if (relationship && relationship.relationshipMeta.kind === 'hasMany') {
|
7329
|
+
return this.hasMany(keyName);
|
7330
|
+
}
|
7331
|
+
|
7332
|
+
return ember$data$lib$system$snapshot$$get(this.record, keyName);
|
7333
|
+
},
|
7334
|
+
|
7335
|
+
/**
|
7336
|
+
@method unknownProperty
|
7337
|
+
@param {String} keyName
|
7338
|
+
@return {Object} The property value
|
7339
|
+
@deprecated Use [attr](#method_attr), [belongsTo](#method_belongsTo) or [hasMany](#method_hasMany) instead
|
7340
|
+
*/
|
7341
|
+
unknownProperty: function(keyName) {
|
7342
|
+
return this.get(keyName);
|
7343
|
+
}
|
7344
|
+
};
|
7345
|
+
|
7346
|
+
var ember$data$lib$system$snapshot$$default = ember$data$lib$system$snapshot$$Snapshot;
|
7347
|
+
|
7348
|
+
/**
|
7349
|
+
@module ember-data
|
7350
|
+
*/
|
7351
|
+
|
7352
|
+
var ember$data$lib$system$model$model$$get = Ember.get;
|
7353
|
+
var ember$data$lib$system$model$model$$set = Ember.set;
|
7354
|
+
var ember$data$lib$system$model$model$$Promise = Ember.RSVP.Promise;
|
7355
|
+
var ember$data$lib$system$model$model$$forEach = Ember.ArrayPolyfills.forEach;
|
7356
|
+
var ember$data$lib$system$model$model$$map = Ember.ArrayPolyfills.map;
|
7357
|
+
|
7358
|
+
var ember$data$lib$system$model$model$$retrieveFromCurrentState = Ember.computed('currentState', function(key, value) {
|
7359
|
+
return ember$data$lib$system$model$model$$get(ember$data$lib$system$model$model$$get(this, 'currentState'), key);
|
7360
|
+
}).readOnly();
|
7361
|
+
|
7362
|
+
var ember$data$lib$system$model$model$$_extractPivotNameCache = Ember.create(null);
|
7363
|
+
var ember$data$lib$system$model$model$$_splitOnDotCache = Ember.create(null);
|
7364
|
+
|
7365
|
+
function ember$data$lib$system$model$model$$splitOnDot(name) {
|
7366
|
+
return ember$data$lib$system$model$model$$_splitOnDotCache[name] || (
|
7367
|
+
(ember$data$lib$system$model$model$$_splitOnDotCache[name] = name.split('.'))
|
7368
|
+
);
|
7369
|
+
}
|
6887
7370
|
|
6888
7371
|
function ember$data$lib$system$model$model$$extractPivotName(name) {
|
6889
7372
|
return ember$data$lib$system$model$model$$_extractPivotNameCache[name] || (
|
@@ -6891,6 +7374,33 @@
|
|
6891
7374
|
);
|
6892
7375
|
}
|
6893
7376
|
|
7377
|
+
// Like Ember.merge, but instead returns a list of keys
|
7378
|
+
// for values that fail a strict equality check
|
7379
|
+
// instead of the original object.
|
7380
|
+
function ember$data$lib$system$model$model$$mergeAndReturnChangedKeys(original, updates) {
|
7381
|
+
var changedKeys = [];
|
7382
|
+
|
7383
|
+
if (!updates || typeof updates !== 'object') {
|
7384
|
+
return changedKeys;
|
7385
|
+
}
|
7386
|
+
|
7387
|
+
var keys = Ember.keys(updates);
|
7388
|
+
var length = keys.length;
|
7389
|
+
var i, val, key;
|
7390
|
+
|
7391
|
+
for (i = 0; i < length; i++) {
|
7392
|
+
key = keys[i];
|
7393
|
+
val = updates[key];
|
7394
|
+
|
7395
|
+
if (original[key] !== val) {
|
7396
|
+
changedKeys.push(key);
|
7397
|
+
}
|
7398
|
+
|
7399
|
+
original[key] = val;
|
7400
|
+
}
|
7401
|
+
return changedKeys;
|
7402
|
+
}
|
7403
|
+
|
6894
7404
|
/**
|
6895
7405
|
|
6896
7406
|
The model class that all Ember Data records descend from.
|
@@ -6903,7 +7413,6 @@
|
|
6903
7413
|
var ember$data$lib$system$model$model$$Model = Ember.Object.extend(Ember.Evented, {
|
6904
7414
|
_recordArrays: undefined,
|
6905
7415
|
_relationships: undefined,
|
6906
|
-
_loadingRecordArrays: undefined,
|
6907
7416
|
/**
|
6908
7417
|
If this property is `true` the record is in the `empty`
|
6909
7418
|
state. Empty is the first state all records enter after they have
|
@@ -7232,9 +7741,20 @@
|
|
7232
7741
|
toJSON: function(options) {
|
7233
7742
|
// container is for lazy transform lookups
|
7234
7743
|
var serializer = ember$data$lib$serializers$json_serializer$$default.create({ container: this.container });
|
7235
|
-
|
7744
|
+
var snapshot = this._createSnapshot();
|
7745
|
+
|
7746
|
+
return serializer.serialize(snapshot, options);
|
7236
7747
|
},
|
7237
7748
|
|
7749
|
+
/**
|
7750
|
+
Fired when the record is ready to be interacted with,
|
7751
|
+
that is either loaded from the server or created locally.
|
7752
|
+
|
7753
|
+
@event ready
|
7754
|
+
*/
|
7755
|
+
ready: function() {
|
7756
|
+
this.store.recordArrayManager.recordWasLoaded(this);
|
7757
|
+
},
|
7238
7758
|
/**
|
7239
7759
|
Fired when the record is loaded from the server.
|
7240
7760
|
|
@@ -7290,7 +7810,7 @@
|
|
7290
7810
|
_data: null,
|
7291
7811
|
|
7292
7812
|
init: function() {
|
7293
|
-
this._super();
|
7813
|
+
this._super.apply(this, arguments);
|
7294
7814
|
this._setup();
|
7295
7815
|
},
|
7296
7816
|
|
@@ -7325,7 +7845,7 @@
|
|
7325
7845
|
var model = this;
|
7326
7846
|
//TODO Move into a getter for better perf
|
7327
7847
|
this.constructor.eachRelationship(function(key, descriptor) {
|
7328
|
-
|
7848
|
+
model._relationships[key] = ember$data$lib$system$relationships$state$create$$default(model, descriptor, model.store);
|
7329
7849
|
});
|
7330
7850
|
|
7331
7851
|
},
|
@@ -7365,7 +7885,9 @@
|
|
7365
7885
|
} while (!state.hasOwnProperty(pivotName));
|
7366
7886
|
|
7367
7887
|
var path = ember$data$lib$system$model$model$$splitOnDot(name);
|
7368
|
-
var setups = []
|
7888
|
+
var setups = [];
|
7889
|
+
var enters = [];
|
7890
|
+
var i, l;
|
7369
7891
|
|
7370
7892
|
for (i=0, l=path.length; i<l; i++) {
|
7371
7893
|
state = state[path[i]];
|
@@ -7511,7 +8033,7 @@
|
|
7511
8033
|
clearRelationships: function() {
|
7512
8034
|
this.eachRelationship(function(name, relationship) {
|
7513
8035
|
var rel = this._relationships[name];
|
7514
|
-
if (rel){
|
8036
|
+
if (rel) {
|
7515
8037
|
//TODO(Igor) figure out whether we want to clear or disconnect
|
7516
8038
|
rel.clear();
|
7517
8039
|
rel.destroy();
|
@@ -7581,7 +8103,7 @@
|
|
7581
8103
|
_preloadRelationship: function(key, preloadValue) {
|
7582
8104
|
var relationshipMeta = this.constructor.metaForProperty(key);
|
7583
8105
|
var type = relationshipMeta.type;
|
7584
|
-
if (relationshipMeta.kind === 'hasMany'){
|
8106
|
+
if (relationshipMeta.kind === 'hasMany') {
|
7585
8107
|
this._preloadHasMany(key, preloadValue, type);
|
7586
8108
|
} else {
|
7587
8109
|
this._preloadBelongsTo(key, preloadValue, type);
|
@@ -7600,7 +8122,7 @@
|
|
7600
8122
|
this._relationships[key].updateRecordsFromAdapter(recordsToSet);
|
7601
8123
|
},
|
7602
8124
|
|
7603
|
-
_preloadBelongsTo: function(key, preloadValue, type){
|
8125
|
+
_preloadBelongsTo: function(key, preloadValue, type) {
|
7604
8126
|
var recordToSet = this._convertStringOrNumberIntoRecord(preloadValue, type);
|
7605
8127
|
|
7606
8128
|
//We use the pathway of setting the hasMany as if it came from the adapter
|
@@ -7609,7 +8131,7 @@
|
|
7609
8131
|
},
|
7610
8132
|
|
7611
8133
|
_convertStringOrNumberIntoRecord: function(value, type) {
|
7612
|
-
if (Ember.typeOf(value) === 'string' || Ember.typeOf(value) === 'number'){
|
8134
|
+
if (Ember.typeOf(value) === 'string' || Ember.typeOf(value) === 'number') {
|
7613
8135
|
return this.store.recordForId(type, value);
|
7614
8136
|
}
|
7615
8137
|
return value;
|
@@ -7622,7 +8144,7 @@
|
|
7622
8144
|
_notifyProperties: function(keys) {
|
7623
8145
|
Ember.beginPropertyChanges();
|
7624
8146
|
var key;
|
7625
|
-
for (var i = 0, length = keys.length; i < length; i++){
|
8147
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
7626
8148
|
key = keys[i];
|
7627
8149
|
this.notifyPropertyChange(key);
|
7628
8150
|
}
|
@@ -7679,10 +8201,11 @@
|
|
7679
8201
|
@method adapterDidCommit
|
7680
8202
|
*/
|
7681
8203
|
adapterDidCommit: function(data) {
|
8204
|
+
var changedKeys;
|
7682
8205
|
ember$data$lib$system$model$model$$set(this, 'isError', false);
|
7683
8206
|
|
7684
8207
|
if (data) {
|
7685
|
-
this._data
|
8208
|
+
changedKeys = ember$data$lib$system$model$model$$mergeAndReturnChangedKeys(this._data, data);
|
7686
8209
|
} else {
|
7687
8210
|
ember$data$lib$system$merge$$default(this._data, this._inFlightAttributes);
|
7688
8211
|
}
|
@@ -7694,7 +8217,7 @@
|
|
7694
8217
|
|
7695
8218
|
if (!data) { return; }
|
7696
8219
|
|
7697
|
-
this._notifyProperties(
|
8220
|
+
this._notifyProperties(changedKeys);
|
7698
8221
|
},
|
7699
8222
|
|
7700
8223
|
/**
|
@@ -7727,11 +8250,11 @@
|
|
7727
8250
|
setupData: function(data) {
|
7728
8251
|
Ember.assert("Expected an object as `data` in `setupData`", Ember.typeOf(data) === 'object');
|
7729
8252
|
|
7730
|
-
|
8253
|
+
var changedKeys = ember$data$lib$system$model$model$$mergeAndReturnChangedKeys(this._data, data);
|
7731
8254
|
|
7732
8255
|
this.pushedData();
|
7733
8256
|
|
7734
|
-
this._notifyProperties(
|
8257
|
+
this._notifyProperties(changedKeys);
|
7735
8258
|
},
|
7736
8259
|
|
7737
8260
|
materializeId: function(id) {
|
@@ -7739,7 +8262,7 @@
|
|
7739
8262
|
},
|
7740
8263
|
|
7741
8264
|
materializeAttributes: function(attributes) {
|
7742
|
-
Ember.assert("Must pass
|
8265
|
+
Ember.assert("Must pass an object to materializeAttributes", !!attributes);
|
7743
8266
|
ember$data$lib$system$merge$$default(this._data, attributes);
|
7744
8267
|
},
|
7745
8268
|
|
@@ -7793,6 +8316,14 @@
|
|
7793
8316
|
this._notifyProperties(dirtyKeys);
|
7794
8317
|
},
|
7795
8318
|
|
8319
|
+
/**
|
8320
|
+
@method _createSnapshot
|
8321
|
+
@private
|
8322
|
+
*/
|
8323
|
+
_createSnapshot: function() {
|
8324
|
+
return new ember$data$lib$system$snapshot$$default(this);
|
8325
|
+
},
|
8326
|
+
|
7796
8327
|
toStringExtension: function() {
|
7797
8328
|
return ember$data$lib$system$model$model$$get(this, 'id');
|
7798
8329
|
},
|
@@ -7805,7 +8336,7 @@
|
|
7805
8336
|
|
7806
8337
|
```javascript
|
7807
8338
|
record.set('name', 'Tomster');
|
7808
|
-
record.save().then(function(){
|
8339
|
+
record.save().then(function() {
|
7809
8340
|
// Success callback
|
7810
8341
|
}, function() {
|
7811
8342
|
// Error callback
|
@@ -7859,8 +8390,8 @@
|
|
7859
8390
|
|
7860
8391
|
var record = this;
|
7861
8392
|
var promiseLabel = "DS: Model#reload of " + this;
|
7862
|
-
var promise = new ember$data$lib$system$model$model$$Promise(function(resolve){
|
7863
|
-
|
8393
|
+
var promise = new ember$data$lib$system$model$model$$Promise(function(resolve) {
|
8394
|
+
record.send('reloadRecord', resolve);
|
7864
8395
|
}, promiseLabel).then(function() {
|
7865
8396
|
record.set('isReloading', false);
|
7866
8397
|
record.set('isError', false);
|
@@ -7885,14 +8416,12 @@
|
|
7885
8416
|
*/
|
7886
8417
|
adapterDidInvalidate: function(errors) {
|
7887
8418
|
var recordErrors = ember$data$lib$system$model$model$$get(this, 'errors');
|
7888
|
-
|
7889
|
-
if (errors
|
7890
|
-
|
8419
|
+
for (var key in errors) {
|
8420
|
+
if (!errors.hasOwnProperty(key)) {
|
8421
|
+
continue;
|
7891
8422
|
}
|
8423
|
+
recordErrors.add(key, errors[key]);
|
7892
8424
|
}
|
7893
|
-
|
7894
|
-
this.eachAttribute(addError);
|
7895
|
-
this.eachRelationship(addError);
|
7896
8425
|
this._saveWasRejected();
|
7897
8426
|
},
|
7898
8427
|
|
@@ -7929,7 +8458,7 @@
|
|
7929
8458
|
var args = new Array(length - 1);
|
7930
8459
|
var name = arguments[0];
|
7931
8460
|
|
7932
|
-
for (var i = 1; i < length; i++
|
8461
|
+
for (var i = 1; i < length; i++) {
|
7933
8462
|
args[i - 1] = arguments[i];
|
7934
8463
|
}
|
7935
8464
|
|
@@ -7941,7 +8470,7 @@
|
|
7941
8470
|
var length = arguments.length;
|
7942
8471
|
var args = new Array(length);
|
7943
8472
|
|
7944
|
-
for (var i = 0; i < length; i++
|
8473
|
+
for (var i = 0; i < length; i++) {
|
7945
8474
|
args[i] = arguments[i];
|
7946
8475
|
}
|
7947
8476
|
|
@@ -7960,7 +8489,7 @@
|
|
7960
8489
|
},
|
7961
8490
|
|
7962
8491
|
willDestroy: function() {
|
7963
|
-
this._super();
|
8492
|
+
this._super.apply(this, arguments);
|
7964
8493
|
this.clearRelationships();
|
7965
8494
|
},
|
7966
8495
|
|
@@ -8365,7 +8894,7 @@
|
|
8365
8894
|
Define your application's store like this:
|
8366
8895
|
|
8367
8896
|
```javascript
|
8368
|
-
MyApp.
|
8897
|
+
MyApp.ApplicationStore = DS.Store.extend();
|
8369
8898
|
```
|
8370
8899
|
|
8371
8900
|
Most Ember.js applications will only have a single `DS.Store` that is
|
@@ -8473,7 +9002,8 @@
|
|
8473
9002
|
@param {Object} options an options hash
|
8474
9003
|
*/
|
8475
9004
|
serialize: function(record, options) {
|
8476
|
-
|
9005
|
+
var snapshot = record._createSnapshot();
|
9006
|
+
return this.serializerFor(snapshot.typeKey).serialize(snapshot, options);
|
8477
9007
|
},
|
8478
9008
|
|
8479
9009
|
/**
|
@@ -8541,7 +9071,7 @@
|
|
8541
9071
|
// to avoid conflicts.
|
8542
9072
|
|
8543
9073
|
if (ember$data$lib$system$store$$isNone(properties.id)) {
|
8544
|
-
properties.id = this._generateId(type);
|
9074
|
+
properties.id = this._generateId(type, properties);
|
8545
9075
|
}
|
8546
9076
|
|
8547
9077
|
// Coerce ID to a string
|
@@ -8566,13 +9096,14 @@
|
|
8566
9096
|
@method _generateId
|
8567
9097
|
@private
|
8568
9098
|
@param {String} type
|
9099
|
+
@param {Object} properties from the new record
|
8569
9100
|
@return {String} if the adapter can generate one, an ID
|
8570
9101
|
*/
|
8571
|
-
_generateId: function(type) {
|
9102
|
+
_generateId: function(type, properties) {
|
8572
9103
|
var adapter = this.adapterFor(type);
|
8573
9104
|
|
8574
9105
|
if (adapter && adapter.generateIdForRecord) {
|
8575
|
-
return adapter.generateIdForRecord(this);
|
9106
|
+
return adapter.generateIdForRecord(this, type, properties);
|
8576
9107
|
}
|
8577
9108
|
|
8578
9109
|
return null;
|
@@ -8680,7 +9211,8 @@
|
|
8680
9211
|
|
8681
9212
|
This will ask the adapter's `findAll` method to find the records for the
|
8682
9213
|
given type, and return a promise that will be resolved once the server
|
8683
|
-
returns the values.
|
9214
|
+
returns the values. The promise will resolve into all records of this type
|
9215
|
+
present in the store, even if the server only returns a subset of them.
|
8684
9216
|
|
8685
9217
|
---
|
8686
9218
|
|
@@ -8691,9 +9223,37 @@
|
|
8691
9223
|
store.find('person', { page: 1 });
|
8692
9224
|
```
|
8693
9225
|
|
8694
|
-
|
8695
|
-
|
8696
|
-
|
9226
|
+
By passing an object `{page: 1}` as an argument to the find method, it
|
9227
|
+
delegates to the adapter's findQuery method. The adapter then makes
|
9228
|
+
a call to the server, transforming the object `{page: 1}` as parameters
|
9229
|
+
that are sent along, and will return a RecordArray when the promise
|
9230
|
+
resolves.
|
9231
|
+
|
9232
|
+
Exposing queries this way seems preferable to creating an abstract query
|
9233
|
+
language for all server-side queries, and then require all adapters to
|
9234
|
+
implement them.
|
9235
|
+
|
9236
|
+
The call made to the server, using a Rails backend, will look something like this:
|
9237
|
+
|
9238
|
+
```
|
9239
|
+
Started GET "/api/v1/person?page=1"
|
9240
|
+
Processing by Api::V1::PersonsController#index as HTML
|
9241
|
+
Parameters: {"page"=>"1"}
|
9242
|
+
```
|
9243
|
+
|
9244
|
+
If you do something like this:
|
9245
|
+
|
9246
|
+
```javascript
|
9247
|
+
store.find('person', {ids: [1, 2, 3]});
|
9248
|
+
```
|
9249
|
+
|
9250
|
+
The call to the server, using a Rails backend, will look something like this:
|
9251
|
+
|
9252
|
+
```
|
9253
|
+
Started GET "/api/v1/person?ids%5B%5D=1&ids%5B%5D=2&ids%5B%5D=3"
|
9254
|
+
Processing by Api::V1::PersonsController#index as HTML
|
9255
|
+
Parameters: {"ids"=>["1", "2", "3"]}
|
9256
|
+
```
|
8697
9257
|
|
8698
9258
|
@method find
|
8699
9259
|
@param {String or subclass of DS.Model} type
|
@@ -8737,13 +9297,13 @@
|
|
8737
9297
|
});
|
8738
9298
|
```
|
8739
9299
|
|
8740
|
-
@method
|
9300
|
+
@method fetchById
|
8741
9301
|
@param {String or subclass of DS.Model} type
|
8742
9302
|
@param {String|Integer} id
|
8743
9303
|
@param {Object} preload - optional set of attributes and relationships passed in either as IDs or as actual models
|
8744
9304
|
@return {Promise} promise
|
8745
9305
|
*/
|
8746
|
-
|
9306
|
+
fetchById: function(type, id, preload) {
|
8747
9307
|
if (this.hasRecordForId(type, id)) {
|
8748
9308
|
return this.getById(type, id).reload();
|
8749
9309
|
} else {
|
@@ -8751,6 +9311,33 @@
|
|
8751
9311
|
}
|
8752
9312
|
},
|
8753
9313
|
|
9314
|
+
/**
|
9315
|
+
This method returns a fresh collection from the server, regardless of if there is already records
|
9316
|
+
in the store or not.
|
9317
|
+
|
9318
|
+
@method fetchAll
|
9319
|
+
@param {String or subclass of DS.Model} type
|
9320
|
+
@return {Promise} promise
|
9321
|
+
*/
|
9322
|
+
fetchAll: function(type) {
|
9323
|
+
type = this.modelFor(type);
|
9324
|
+
|
9325
|
+
return this._fetchAll(type, this.all(type));
|
9326
|
+
},
|
9327
|
+
|
9328
|
+
/**
|
9329
|
+
@method fetch
|
9330
|
+
@param {String or subclass of DS.Model} type
|
9331
|
+
@param {String|Integer} id
|
9332
|
+
@param {Object} preload - optional set of attributes and relationships passed in either as IDs or as actual models
|
9333
|
+
@return {Promise} promise
|
9334
|
+
@deprecated Use [fetchById](#method_fetchById) instead
|
9335
|
+
*/
|
9336
|
+
fetch: function(type, id, preload) {
|
9337
|
+
Ember.deprecate('Using store.fetch() has been deprecated. Use store.fetchById for fetching individual records or store.fetchAll for collections');
|
9338
|
+
return this.fetchById(type, id, preload);
|
9339
|
+
},
|
9340
|
+
|
8754
9341
|
/**
|
8755
9342
|
This method returns a record for a given type and id combination.
|
8756
9343
|
|
@@ -8779,7 +9366,7 @@
|
|
8779
9366
|
if (ember$data$lib$system$store$$get(record, 'isEmpty')) {
|
8780
9367
|
fetchedRecord = this.scheduleFetch(record);
|
8781
9368
|
//TODO double check about reloading
|
8782
|
-
} else if (ember$data$lib$system$store$$get(record, 'isLoading')){
|
9369
|
+
} else if (ember$data$lib$system$store$$get(record, 'isLoading')) {
|
8783
9370
|
fetchedRecord = record._loadingPromise;
|
8784
9371
|
}
|
8785
9372
|
|
@@ -8844,7 +9431,7 @@
|
|
8844
9431
|
|
8845
9432
|
record.loadingData(promise);
|
8846
9433
|
|
8847
|
-
if (!this._pendingFetch.get(type)){
|
9434
|
+
if (!this._pendingFetch.get(type)) {
|
8848
9435
|
this._pendingFetch.set(type, [recordResolverPair]);
|
8849
9436
|
} else {
|
8850
9437
|
this._pendingFetch.get(type).push(recordResolverPair);
|
@@ -8854,7 +9441,7 @@
|
|
8854
9441
|
return promise;
|
8855
9442
|
},
|
8856
9443
|
|
8857
|
-
flushAllPendingFetches: function(){
|
9444
|
+
flushAllPendingFetches: function() {
|
8858
9445
|
if (this.isDestroyed || this.isDestroying) {
|
8859
9446
|
return;
|
8860
9447
|
}
|
@@ -8874,9 +9461,9 @@
|
|
8874
9461
|
}
|
8875
9462
|
|
8876
9463
|
function resolveFoundRecords(records) {
|
8877
|
-
ember$data$lib$system$store$$forEach(records, function(record){
|
9464
|
+
ember$data$lib$system$store$$forEach(records, function(record) {
|
8878
9465
|
var pair = Ember.A(recordResolverPairs).findBy('record', record);
|
8879
|
-
if (pair){
|
9466
|
+
if (pair) {
|
8880
9467
|
var resolver = pair.resolver;
|
8881
9468
|
resolver.resolve(record);
|
8882
9469
|
}
|
@@ -8897,9 +9484,9 @@
|
|
8897
9484
|
}
|
8898
9485
|
|
8899
9486
|
function rejectRecords(records, error) {
|
8900
|
-
ember$data$lib$system$store$$forEach(records, function(record){
|
9487
|
+
ember$data$lib$system$store$$forEach(records, function(record) {
|
8901
9488
|
var pair = Ember.A(recordResolverPairs).findBy('record', record);
|
8902
|
-
if (pair){
|
9489
|
+
if (pair) {
|
8903
9490
|
var resolver = pair.resolver;
|
8904
9491
|
resolver.reject(error);
|
8905
9492
|
}
|
@@ -9121,19 +9708,17 @@
|
|
9121
9708
|
@return {DS.AdapterPopulatedRecordArray}
|
9122
9709
|
*/
|
9123
9710
|
findAll: function(typeName) {
|
9124
|
-
|
9125
|
-
|
9126
|
-
return this.fetchAll(type, this.all(type));
|
9711
|
+
return this.fetchAll(typeName);
|
9127
9712
|
},
|
9128
9713
|
|
9129
9714
|
/**
|
9130
|
-
@method
|
9715
|
+
@method _fetchAll
|
9131
9716
|
@private
|
9132
9717
|
@param {DS.Model} type
|
9133
9718
|
@param {DS.RecordArray} array
|
9134
9719
|
@return {Promise} promise
|
9135
9720
|
*/
|
9136
|
-
|
9721
|
+
_fetchAll: function(type, array) {
|
9137
9722
|
var adapter = this.adapterFor(type);
|
9138
9723
|
var sinceToken = this.typeMapFor(type).metadata.since;
|
9139
9724
|
|
@@ -9353,9 +9938,8 @@
|
|
9353
9938
|
// ............
|
9354
9939
|
|
9355
9940
|
/**
|
9356
|
-
If the adapter updates attributes
|
9357
|
-
|
9358
|
-
membership in any filters.
|
9941
|
+
If the adapter updates attributes the record will notify
|
9942
|
+
the store to update its membership in any filters.
|
9359
9943
|
To avoid thrashing, this method is invoked only once per
|
9360
9944
|
|
9361
9945
|
run loop per record.
|
@@ -9402,7 +9986,8 @@
|
|
9402
9986
|
this._pendingSave = [];
|
9403
9987
|
|
9404
9988
|
ember$data$lib$system$store$$forEach(pending, function(tuple) {
|
9405
|
-
var record = tuple[0]
|
9989
|
+
var record = tuple[0];
|
9990
|
+
var resolver = tuple[1];
|
9406
9991
|
var adapter = this.adapterFor(record.constructor);
|
9407
9992
|
var operation;
|
9408
9993
|
|
@@ -9574,7 +10159,7 @@
|
|
9574
10159
|
return factory;
|
9575
10160
|
},
|
9576
10161
|
|
9577
|
-
modelFactoryFor: function(key){
|
10162
|
+
modelFactoryFor: function(key) {
|
9578
10163
|
return this.container.lookupFactory('model:' + key);
|
9579
10164
|
},
|
9580
10165
|
|
@@ -9652,15 +10237,15 @@
|
|
9652
10237
|
var type = this.modelFor(typeName);
|
9653
10238
|
var filter = Ember.EnumerableUtils.filter;
|
9654
10239
|
|
9655
|
-
// If
|
9656
|
-
//
|
9657
|
-
if (
|
10240
|
+
// If Ember.ENV.DS_WARN_ON_UNKNOWN_KEYS is set to true and the payload
|
10241
|
+
// contains unknown keys, log a warning.
|
10242
|
+
if (Ember.ENV.DS_WARN_ON_UNKNOWN_KEYS) {
|
9658
10243
|
Ember.warn("The payload for '" + type.typeKey + "' contains these unknown keys: " +
|
9659
10244
|
Ember.inspect(filter(Ember.keys(data), function(key) {
|
9660
|
-
return !ember$data$lib$system$store$$get(type, 'fields').has(key)
|
10245
|
+
return !(key === 'id' || key === 'links' || ember$data$lib$system$store$$get(type, 'fields').has(key) || key.match(/Type$/));
|
9661
10246
|
})) + ". Make sure they've been defined in your model.",
|
9662
10247
|
filter(Ember.keys(data), function(key) {
|
9663
|
-
return !ember$data$lib$system$store$$get(type, 'fields').has(key)
|
10248
|
+
return !(key === 'id' || key === 'links' || ember$data$lib$system$store$$get(type, 'fields').has(key) || key.match(/Type$/));
|
9664
10249
|
}).length === 0
|
9665
10250
|
);
|
9666
10251
|
}
|
@@ -9865,19 +10450,35 @@
|
|
9865
10450
|
return record;
|
9866
10451
|
},
|
9867
10452
|
|
10453
|
+
//Called by the state machine to notify the store that the record is ready to be interacted with
|
10454
|
+
recordWasLoaded: function(record) {
|
10455
|
+
this.recordArrayManager.recordWasLoaded(record);
|
10456
|
+
},
|
10457
|
+
|
9868
10458
|
// ...............
|
9869
10459
|
// . DESTRUCTION .
|
9870
10460
|
// ...............
|
9871
10461
|
|
10462
|
+
/**
|
10463
|
+
@method dematerializeRecord
|
10464
|
+
@private
|
10465
|
+
@param {DS.Model} record
|
10466
|
+
@deprecated Use [unloadRecord](#method_unloadRecord) instead
|
10467
|
+
*/
|
10468
|
+
dematerializeRecord: function(record) {
|
10469
|
+
Ember.deprecate('Using store.dematerializeRecord() has been deprecated since it was intended for private use only. You should use store.unloadRecord() instead.');
|
10470
|
+
this._dematerializeRecord(record);
|
10471
|
+
},
|
10472
|
+
|
9872
10473
|
/**
|
9873
10474
|
When a record is destroyed, this un-indexes it and
|
9874
10475
|
removes it from any record arrays so it can be GCed.
|
9875
10476
|
|
9876
|
-
@method
|
10477
|
+
@method _dematerializeRecord
|
9877
10478
|
@private
|
9878
10479
|
@param {DS.Model} record
|
9879
10480
|
*/
|
9880
|
-
|
10481
|
+
_dematerializeRecord: function(record) {
|
9881
10482
|
var type = record.constructor;
|
9882
10483
|
var typeMap = this.typeMapFor(type);
|
9883
10484
|
var id = ember$data$lib$system$store$$get(record, 'id');
|
@@ -9905,7 +10506,8 @@
|
|
9905
10506
|
@return DS.Adapter
|
9906
10507
|
*/
|
9907
10508
|
adapterFor: function(type) {
|
9908
|
-
var
|
10509
|
+
var adapter;
|
10510
|
+
var container = this.container;
|
9909
10511
|
|
9910
10512
|
if (container) {
|
9911
10513
|
adapter = container.lookup('adapter:' + type.typeKey) || container.lookup('adapter:application');
|
@@ -9999,8 +10601,8 @@
|
|
9999
10601
|
type = ember$data$lib$system$store$$typeFor(relationship, key, data);
|
10000
10602
|
data[key] = store.recordForId(type, id);
|
10001
10603
|
} else if (typeof id === 'object') {
|
10002
|
-
// polymorphic
|
10003
|
-
Ember.assert('Ember Data expected a number or string to represent the record(s) in the `' + relationship.key + '` relationship instead it found an object. If this is a polymorphic relationship please specify a `type` key. If this is an embedded relationship please include the `DS.EmbeddedRecordsMixin` and specify the `' + relationship.key +'` property in your serializer\'s attrs
|
10604
|
+
// hasMany polymorphic
|
10605
|
+
Ember.assert('Ember Data expected a number or string to represent the record(s) in the `' + relationship.key + '` relationship instead it found an object. If this is a polymorphic relationship please specify a `type` key. If this is an embedded relationship please include the `DS.EmbeddedRecordsMixin` and specify the `' + relationship.key +'` property in your serializer\'s attrs object.', id.type);
|
10004
10606
|
data[key] = store.recordForId(id.type, id.id);
|
10005
10607
|
}
|
10006
10608
|
}
|
@@ -10102,6 +10704,9 @@
|
|
10102
10704
|
var record = store.getById(type, id);
|
10103
10705
|
if (record) {
|
10104
10706
|
record.notFound();
|
10707
|
+
if (ember$data$lib$system$store$$get(record, 'isEmpty')) {
|
10708
|
+
store.unloadRecord(record);
|
10709
|
+
}
|
10105
10710
|
}
|
10106
10711
|
throw error;
|
10107
10712
|
}, "DS: Extract payload of '" + type + "'");
|
@@ -10275,13 +10880,13 @@
|
|
10275
10880
|
}
|
10276
10881
|
relationship.setCanonicalRecord(value);
|
10277
10882
|
} else if (kind === 'hasMany' && value) {
|
10278
|
-
|
10883
|
+
relationship.updateRecordsFromAdapter(value);
|
10279
10884
|
}
|
10280
10885
|
});
|
10281
10886
|
}
|
10282
10887
|
|
10283
10888
|
var ember$data$lib$system$store$$default = ember$data$lib$system$store$$Store;
|
10284
|
-
function ember$data$lib$initializers$store$$initializeStore(container, application){
|
10889
|
+
function ember$data$lib$initializers$store$$initializeStore(container, application) {
|
10285
10890
|
Ember.deprecate('Specifying a custom Store for Ember Data on your global namespace as `App.Store` ' +
|
10286
10891
|
'has been deprecated. Please use `App.ApplicationStore` instead.', !(application && application.Store));
|
10287
10892
|
|
@@ -10388,11 +10993,11 @@
|
|
10388
10993
|
}
|
10389
10994
|
|
10390
10995
|
return this.getUTCFullYear() +
|
10391
|
-
'-' + pad(
|
10392
|
-
'-' + pad(
|
10393
|
-
'T' + pad(
|
10394
|
-
':' + pad(
|
10395
|
-
':' + pad(
|
10996
|
+
'-' + pad(this.getUTCMonth() + 1) +
|
10997
|
+
'-' + pad(this.getUTCDate()) +
|
10998
|
+
'T' + pad(this.getUTCHours()) +
|
10999
|
+
':' + pad(this.getUTCMinutes()) +
|
11000
|
+
':' + pad(this.getUTCSeconds()) +
|
10396
11001
|
'.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
|
10397
11002
|
'Z';
|
10398
11003
|
};
|
@@ -10460,17 +11065,17 @@
|
|
10460
11065
|
}
|
10461
11066
|
});
|
10462
11067
|
|
10463
|
-
function ember$data$lib$initializers$transforms$$initializeTransforms(container){
|
11068
|
+
function ember$data$lib$initializers$transforms$$initializeTransforms(container) {
|
10464
11069
|
container.register('transform:boolean', ember$data$lib$transforms$boolean$$default);
|
10465
|
-
container.register('transform:date',
|
10466
|
-
container.register('transform:number',
|
10467
|
-
container.register('transform:string',
|
11070
|
+
container.register('transform:date', ember$data$lib$transforms$date$$default);
|
11071
|
+
container.register('transform:number', ember$data$lib$transforms$number$$default);
|
11072
|
+
container.register('transform:string', ember$data$lib$transforms$string$$default);
|
10468
11073
|
}
|
10469
11074
|
var ember$data$lib$initializers$transforms$$default = ember$data$lib$initializers$transforms$$initializeTransforms;
|
10470
|
-
function ember$data$lib$initializers$store_injections$$initializeStoreInjections(container){
|
10471
|
-
container.injection('controller',
|
10472
|
-
container.injection('route',
|
10473
|
-
container.injection('serializer',
|
11075
|
+
function ember$data$lib$initializers$store_injections$$initializeStoreInjections(container) {
|
11076
|
+
container.injection('controller', 'store', 'store:main');
|
11077
|
+
container.injection('route', 'store', 'store:main');
|
11078
|
+
container.injection('serializer', 'store', 'store:main');
|
10474
11079
|
container.injection('data-adapter', 'store', 'store:main');
|
10475
11080
|
}
|
10476
11081
|
var ember$data$lib$initializers$store_injections$$default = ember$data$lib$initializers$store_injections$$initializeStoreInjections;
|
@@ -10499,9 +11104,9 @@
|
|
10499
11104
|
var count = 0;
|
10500
11105
|
var self = this;
|
10501
11106
|
ember$data$lib$system$debug$debug_adapter$$get(type, 'attributes').forEach(function(meta, name) {
|
10502
|
-
|
10503
|
-
|
10504
|
-
|
11107
|
+
if (count++ > self.attributeLimit) { return false; }
|
11108
|
+
var desc = ember$data$lib$system$debug$debug_adapter$$capitalize(ember$data$lib$system$debug$debug_adapter$$underscore(name).replace('_', ' '));
|
11109
|
+
columns.push({ name: name, desc: desc });
|
10505
11110
|
});
|
10506
11111
|
return columns;
|
10507
11112
|
},
|
@@ -10511,7 +11116,8 @@
|
|
10511
11116
|
},
|
10512
11117
|
|
10513
11118
|
getRecordColumnValues: function(record) {
|
10514
|
-
var self = this
|
11119
|
+
var self = this;
|
11120
|
+
var count = 0;
|
10515
11121
|
var columnValues = { id: ember$data$lib$system$debug$debug_adapter$$get(record, 'id') };
|
10516
11122
|
|
10517
11123
|
record.eachAttribute(function(key) {
|
@@ -10555,7 +11161,8 @@
|
|
10555
11161
|
},
|
10556
11162
|
|
10557
11163
|
observeRecord: function(record, recordUpdated) {
|
10558
|
-
var releaseMethods = Ember.A()
|
11164
|
+
var releaseMethods = Ember.A();
|
11165
|
+
var self = this;
|
10559
11166
|
var keysToObserve = Ember.A(['id', 'isNew', 'isDirty']);
|
10560
11167
|
|
10561
11168
|
record.eachAttribute(function(key) {
|
@@ -10581,11 +11188,11 @@
|
|
10581
11188
|
|
10582
11189
|
});
|
10583
11190
|
|
10584
|
-
function ember$data$lib$initializers$data_adapter$$initializeDebugAdapter(container){
|
11191
|
+
function ember$data$lib$initializers$data_adapter$$initializeDebugAdapter(container) {
|
10585
11192
|
container.register('data-adapter:main', ember$data$lib$system$debug$debug_adapter$$default);
|
10586
11193
|
}
|
10587
11194
|
var ember$data$lib$initializers$data_adapter$$default = ember$data$lib$initializers$data_adapter$$initializeDebugAdapter;
|
10588
|
-
function ember$data$lib$setup$container$$setupContainer(container, application){
|
11195
|
+
function ember$data$lib$setup$container$$setupContainer(container, application) {
|
10589
11196
|
// application is not a required argument. This ensures
|
10590
11197
|
// testing setups can setup a container without booting an
|
10591
11198
|
// entire ember application.
|
@@ -10692,7 +11299,8 @@
|
|
10692
11299
|
*/
|
10693
11300
|
Ember.Date = Ember.Date || {};
|
10694
11301
|
|
10695
|
-
var origParse = Date.parse
|
11302
|
+
var origParse = Date.parse;
|
11303
|
+
var numericKeys = [1, 4, 5, 6, 7, 10, 11];
|
10696
11304
|
|
10697
11305
|
/**
|
10698
11306
|
@method parse
|
@@ -10700,51 +11308,42 @@
|
|
10700
11308
|
@return {Number} timestamp
|
10701
11309
|
*/
|
10702
11310
|
Ember.Date.parse = function (date) {
|
10703
|
-
|
10704
|
-
|
10705
|
-
// ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
|
10706
|
-
// before falling back to any implementation-specific date parsing, so that’s what we do, even if native
|
10707
|
-
// implementations could be faster
|
10708
|
-
// 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm
|
10709
|
-
if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) {
|
10710
|
-
// avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
|
10711
|
-
for (var i = 0, k; (k = numericKeys[i]); ++i) {
|
10712
|
-
struct[k] = +struct[k] || 0;
|
10713
|
-
}
|
11311
|
+
var timestamp, struct;
|
11312
|
+
var minutesOffset = 0;
|
10714
11313
|
|
10715
|
-
|
10716
|
-
|
10717
|
-
|
11314
|
+
// ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
|
11315
|
+
// before falling back to any implementation-specific date parsing, so that’s what we do, even if native
|
11316
|
+
// implementations could be faster
|
11317
|
+
// 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm
|
11318
|
+
if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) {
|
11319
|
+
// avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
|
11320
|
+
for (var i = 0, k; (k = numericKeys[i]); ++i) {
|
11321
|
+
struct[k] = +struct[k] || 0;
|
11322
|
+
}
|
10718
11323
|
|
10719
|
-
|
10720
|
-
|
11324
|
+
// allow undefined days and months
|
11325
|
+
struct[2] = (+struct[2] || 1) - 1;
|
11326
|
+
struct[3] = +struct[3] || 1;
|
10721
11327
|
|
10722
|
-
|
10723
|
-
|
10724
|
-
}
|
10725
|
-
}
|
11328
|
+
if (struct[8] !== 'Z' && struct[9] !== undefined) {
|
11329
|
+
minutesOffset = struct[10] * 60 + struct[11];
|
10726
11330
|
|
10727
|
-
|
10728
|
-
|
10729
|
-
|
10730
|
-
timestamp = origParse ? origParse(date) : NaN;
|
11331
|
+
if (struct[9] === '+') {
|
11332
|
+
minutesOffset = 0 - minutesOffset;
|
11333
|
+
}
|
10731
11334
|
}
|
10732
11335
|
|
10733
|
-
|
11336
|
+
timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);
|
11337
|
+
} else {
|
11338
|
+
timestamp = origParse ? origParse(date) : NaN;
|
11339
|
+
}
|
11340
|
+
|
11341
|
+
return timestamp;
|
10734
11342
|
};
|
10735
11343
|
|
10736
11344
|
if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Date) {
|
10737
11345
|
Date.parse = Ember.Date.parse;
|
10738
11346
|
}
|
10739
|
-
/*
|
10740
|
-
Detect if the user has a correct Object.create shim.
|
10741
|
-
Ember has provided this for a long time but has had an incorrect shim before 1.8
|
10742
|
-
TODO: Remove for Ember Data 1.0.
|
10743
|
-
*/
|
10744
|
-
var object = Ember.create(null);
|
10745
|
-
if (object.toString !== undefined && Ember.keys(Ember.create({}))[0] === '__proto__'){
|
10746
|
-
throw new Error("Ember Data requires a correct Object.create shim. You should upgrade to Ember >= 1.8 which provides one for you. If you are using ES5-shim, you should try removing that after upgrading Ember.");
|
10747
|
-
}
|
10748
11347
|
|
10749
11348
|
ember$data$lib$system$model$model$$default.reopen({
|
10750
11349
|
|
@@ -10765,9 +11364,9 @@
|
|
10765
11364
|
@private
|
10766
11365
|
*/
|
10767
11366
|
_debugInfo: function() {
|
10768
|
-
var attributes = ['id']
|
10769
|
-
|
10770
|
-
|
11367
|
+
var attributes = ['id'];
|
11368
|
+
var relationships = { belongsTo: [], hasMany: [] };
|
11369
|
+
var expensiveProperties = [];
|
10771
11370
|
|
10772
11371
|
this.eachAttribute(function(name, meta) {
|
10773
11372
|
attributes.push(name);
|
@@ -10845,7 +11444,7 @@
|
|
10845
11444
|
The `attrs` option for a resource `{ embedded: 'always' }` is shorthand for:
|
10846
11445
|
|
10847
11446
|
```js
|
10848
|
-
{
|
11447
|
+
{
|
10849
11448
|
serialize: 'records',
|
10850
11449
|
deserialize: 'records'
|
10851
11450
|
}
|
@@ -10872,7 +11471,7 @@
|
|
10872
11471
|
If you do not overwrite `attrs` for a specific relationship, the `EmbeddedRecordsMixin`
|
10873
11472
|
will behave in the following way:
|
10874
11473
|
|
10875
|
-
BelongsTo: `{ serialize: 'id', deserialize: 'id' }`
|
11474
|
+
BelongsTo: `{ serialize: 'id', deserialize: 'id' }`
|
10876
11475
|
HasMany: `{ serialize: false, deserialize: 'ids' }`
|
10877
11476
|
|
10878
11477
|
### Model Relationships
|
@@ -10939,7 +11538,7 @@
|
|
10939
11538
|
return ember$data$lib$serializers$embedded_records_mixin$$extractEmbeddedRecords(this, this.store, type, normalizedHash);
|
10940
11539
|
},
|
10941
11540
|
|
10942
|
-
keyForRelationship: function(key, type){
|
11541
|
+
keyForRelationship: function(key, type) {
|
10943
11542
|
if (this.hasDeserializeRecordsOption(key)) {
|
10944
11543
|
return this.keyForAttribute(key);
|
10945
11544
|
} else {
|
@@ -10992,34 +11591,34 @@
|
|
10992
11591
|
```
|
10993
11592
|
|
10994
11593
|
@method serializeBelongsTo
|
10995
|
-
@param {DS.
|
11594
|
+
@param {DS.Snapshot} snapshot
|
10996
11595
|
@param {Object} json
|
10997
11596
|
@param {Object} relationship
|
10998
11597
|
*/
|
10999
|
-
serializeBelongsTo: function(
|
11598
|
+
serializeBelongsTo: function(snapshot, json, relationship) {
|
11000
11599
|
var attr = relationship.key;
|
11001
11600
|
if (this.noSerializeOptionSpecified(attr)) {
|
11002
|
-
this._super(
|
11601
|
+
this._super(snapshot, json, relationship);
|
11003
11602
|
return;
|
11004
11603
|
}
|
11005
11604
|
var includeIds = this.hasSerializeIdsOption(attr);
|
11006
11605
|
var includeRecords = this.hasSerializeRecordsOption(attr);
|
11007
|
-
var
|
11606
|
+
var embeddedSnapshot = snapshot.belongsTo(attr);
|
11008
11607
|
var key;
|
11009
11608
|
if (includeIds) {
|
11010
11609
|
key = this.keyForRelationship(attr, relationship.kind);
|
11011
|
-
if (!
|
11610
|
+
if (!embeddedSnapshot) {
|
11012
11611
|
json[key] = null;
|
11013
11612
|
} else {
|
11014
|
-
json[key] =
|
11613
|
+
json[key] = embeddedSnapshot.id;
|
11015
11614
|
}
|
11016
11615
|
} else if (includeRecords) {
|
11017
11616
|
key = this.keyForAttribute(attr);
|
11018
|
-
if (!
|
11617
|
+
if (!embeddedSnapshot) {
|
11019
11618
|
json[key] = null;
|
11020
11619
|
} else {
|
11021
|
-
json[key] =
|
11022
|
-
this.removeEmbeddedForeignKey(
|
11620
|
+
json[key] = embeddedSnapshot.record.serialize({ includeId: true });
|
11621
|
+
this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json[key]);
|
11023
11622
|
}
|
11024
11623
|
}
|
11025
11624
|
},
|
@@ -11101,14 +11700,14 @@
|
|
11101
11700
|
```
|
11102
11701
|
|
11103
11702
|
@method serializeHasMany
|
11104
|
-
@param {DS.
|
11703
|
+
@param {DS.Snapshot} snapshot
|
11105
11704
|
@param {Object} json
|
11106
11705
|
@param {Object} relationship
|
11107
11706
|
*/
|
11108
|
-
serializeHasMany: function(
|
11707
|
+
serializeHasMany: function(snapshot, json, relationship) {
|
11109
11708
|
var attr = relationship.key;
|
11110
11709
|
if (this.noSerializeOptionSpecified(attr)) {
|
11111
|
-
this._super(
|
11710
|
+
this._super(snapshot, json, relationship);
|
11112
11711
|
return;
|
11113
11712
|
}
|
11114
11713
|
var includeIds = this.hasSerializeIdsOption(attr);
|
@@ -11116,13 +11715,13 @@
|
|
11116
11715
|
var key;
|
11117
11716
|
if (includeIds) {
|
11118
11717
|
key = this.keyForRelationship(attr, relationship.kind);
|
11119
|
-
json[key] =
|
11718
|
+
json[key] = snapshot.hasMany(attr, { ids: true });
|
11120
11719
|
} else if (includeRecords) {
|
11121
11720
|
key = this.keyForAttribute(attr);
|
11122
|
-
json[key] =
|
11123
|
-
var
|
11124
|
-
this.removeEmbeddedForeignKey(
|
11125
|
-
return
|
11721
|
+
json[key] = snapshot.hasMany(attr).map(function(embeddedSnapshot) {
|
11722
|
+
var embeddedJson = embeddedSnapshot.record.serialize({ includeId: true });
|
11723
|
+
this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, embeddedJson);
|
11724
|
+
return embeddedJson;
|
11126
11725
|
}, this);
|
11127
11726
|
}
|
11128
11727
|
},
|
@@ -11138,19 +11737,19 @@
|
|
11138
11737
|
the parent record.
|
11139
11738
|
|
11140
11739
|
@method removeEmbeddedForeignKey
|
11141
|
-
@param {DS.
|
11142
|
-
@param {DS.
|
11740
|
+
@param {DS.Snapshot} snapshot
|
11741
|
+
@param {DS.Snapshot} embeddedSnapshot
|
11143
11742
|
@param {Object} relationship
|
11144
11743
|
@param {Object} json
|
11145
11744
|
*/
|
11146
|
-
removeEmbeddedForeignKey: function (
|
11745
|
+
removeEmbeddedForeignKey: function (snapshot, embeddedSnapshot, relationship, json) {
|
11147
11746
|
if (relationship.kind === 'hasMany') {
|
11148
11747
|
return;
|
11149
11748
|
} else if (relationship.kind === 'belongsTo') {
|
11150
|
-
var parentRecord =
|
11749
|
+
var parentRecord = snapshot.type.inverseFor(relationship.key);
|
11151
11750
|
if (parentRecord) {
|
11152
11751
|
var name = parentRecord.name;
|
11153
|
-
var embeddedSerializer = this.store.serializerFor(
|
11752
|
+
var embeddedSerializer = this.store.serializerFor(embeddedSnapshot.type);
|
11154
11753
|
var parentKey = embeddedSerializer.keyForRelationship(name, parentRecord.kind);
|
11155
11754
|
if (parentKey) {
|
11156
11755
|
delete json[parentKey];
|
@@ -11209,13 +11808,16 @@
|
|
11209
11808
|
if (relationship.kind === "hasMany") {
|
11210
11809
|
if (relationship.options.polymorphic) {
|
11211
11810
|
ember$data$lib$serializers$embedded_records_mixin$$extractEmbeddedHasManyPolymorphic(store, key, partial);
|
11212
|
-
}
|
11213
|
-
else {
|
11811
|
+
} else {
|
11214
11812
|
ember$data$lib$serializers$embedded_records_mixin$$extractEmbeddedHasMany(store, key, embeddedType, partial);
|
11215
11813
|
}
|
11216
11814
|
}
|
11217
11815
|
if (relationship.kind === "belongsTo") {
|
11218
|
-
|
11816
|
+
if (relationship.options.polymorphic) {
|
11817
|
+
ember$data$lib$serializers$embedded_records_mixin$$extractEmbeddedBelongsToPolymorphic(store, key, partial);
|
11818
|
+
} else {
|
11819
|
+
ember$data$lib$serializers$embedded_records_mixin$$extractEmbeddedBelongsTo(store, key, embeddedType, partial);
|
11820
|
+
}
|
11219
11821
|
}
|
11220
11822
|
}
|
11221
11823
|
});
|
@@ -11278,8 +11880,26 @@
|
|
11278
11880
|
return hash;
|
11279
11881
|
}
|
11280
11882
|
|
11281
|
-
|
11883
|
+
function ember$data$lib$serializers$embedded_records_mixin$$extractEmbeddedBelongsToPolymorphic(store, key, hash) {
|
11884
|
+
if (!hash[key]) {
|
11885
|
+
return hash;
|
11886
|
+
}
|
11282
11887
|
|
11888
|
+
var data = hash[key];
|
11889
|
+
var typeKey = data.type;
|
11890
|
+
var embeddedSerializer = store.serializerFor(typeKey);
|
11891
|
+
var embeddedType = store.modelFor(typeKey);
|
11892
|
+
var primaryKey = ember$data$lib$serializers$embedded_records_mixin$$get(embeddedSerializer, 'primaryKey');
|
11893
|
+
|
11894
|
+
var embeddedRecord = embeddedSerializer.normalize(embeddedType, data, null);
|
11895
|
+
store.push(embeddedType, embeddedRecord);
|
11896
|
+
|
11897
|
+
hash[key] = embeddedRecord[primaryKey];
|
11898
|
+
hash[key + 'Type'] = typeKey;
|
11899
|
+
return hash;
|
11900
|
+
}
|
11901
|
+
|
11902
|
+
var ember$data$lib$serializers$embedded_records_mixin$$default = ember$data$lib$serializers$embedded_records_mixin$$EmbeddedRecordsMixin;
|
11283
11903
|
|
11284
11904
|
/**
|
11285
11905
|
`DS.belongsTo` is used to define One-To-One and One-To-Many
|
@@ -11345,7 +11965,7 @@
|
|
11345
11965
|
type = undefined;
|
11346
11966
|
}
|
11347
11967
|
|
11348
|
-
Ember.assert("The first argument to DS.belongsTo must be a string representing a model type key, not an instance of " + Ember.inspect(type) + ". E.g., to define a relation to the Person model, use DS.belongsTo('person')", typeof type === 'string' ||
|
11968
|
+
Ember.assert("The first argument to DS.belongsTo must be a string representing a model type key, not an instance of " + Ember.inspect(type) + ". E.g., to define a relation to the Person model, use DS.belongsTo('person')", typeof type === 'string' || typeof type === 'undefined');
|
11349
11969
|
|
11350
11970
|
options = options || {};
|
11351
11971
|
|
@@ -11373,12 +11993,9 @@
|
|
11373
11993
|
}).meta(meta);
|
11374
11994
|
}
|
11375
11995
|
|
11376
|
-
|
11996
|
+
/*
|
11377
11997
|
These observers observe all `belongsTo` relationships on the record. See
|
11378
11998
|
`relationships/ext` to see how these observers get their dependencies.
|
11379
|
-
|
11380
|
-
@class Model
|
11381
|
-
@namespace DS
|
11382
11999
|
*/
|
11383
12000
|
ember$data$lib$system$model$model$$default.reopen({
|
11384
12001
|
notifyBelongsToChanged: function(key) {
|
@@ -11483,7 +12100,7 @@
|
|
11483
12100
|
type = undefined;
|
11484
12101
|
}
|
11485
12102
|
|
11486
|
-
Ember.assert("The first argument to DS.hasMany must be a string representing a model type key, not an instance of " + Ember.inspect(type) + ". E.g., to define a relation to the Comment model, use DS.hasMany('comment')", typeof type === 'string' ||
|
12103
|
+
Ember.assert("The first argument to DS.hasMany must be a string representing a model type key, not an instance of " + Ember.inspect(type) + ". E.g., to define a relation to the Comment model, use DS.hasMany('comment')", typeof type === 'string' || typeof type === 'undefined');
|
11487
12104
|
|
11488
12105
|
options = options || {};
|
11489
12106
|
|
@@ -11513,7 +12130,7 @@
|
|
11513
12130
|
|
11514
12131
|
//Goes away once hasMany is double promisified
|
11515
12132
|
this.notifyPropertyChange(key);
|
11516
|
-
}
|
12133
|
+
}
|
11517
12134
|
});
|
11518
12135
|
|
11519
12136
|
|
@@ -11549,30 +12166,30 @@
|
|
11549
12166
|
var ember$data$lib$system$relationships$ext$$filter = Ember.ArrayPolyfills.filter;
|
11550
12167
|
|
11551
12168
|
var ember$data$lib$system$relationships$ext$$relationshipsDescriptor = Ember.computed(function() {
|
11552
|
-
|
11553
|
-
|
11554
|
-
|
12169
|
+
if (Ember.testing === true && ember$data$lib$system$relationships$ext$$relationshipsDescriptor._cacheable === true) {
|
12170
|
+
ember$data$lib$system$relationships$ext$$relationshipsDescriptor._cacheable = false;
|
12171
|
+
}
|
11555
12172
|
|
11556
|
-
|
11557
|
-
|
11558
|
-
|
12173
|
+
var map = new ember$data$lib$system$map$$MapWithDefault({
|
12174
|
+
defaultValue: function() { return []; }
|
12175
|
+
});
|
11559
12176
|
|
11560
|
-
|
11561
|
-
|
11562
|
-
|
11563
|
-
|
11564
|
-
|
11565
|
-
|
11566
|
-
|
12177
|
+
// Loop through each computed property on the class
|
12178
|
+
this.eachComputedProperty(function(name, meta) {
|
12179
|
+
// If the computed property is a relationship, add
|
12180
|
+
// it to the map.
|
12181
|
+
if (meta.isRelationship) {
|
12182
|
+
meta.key = name;
|
12183
|
+
var relationshipsForType = map.get(ember$data$lib$system$relationship$meta$$typeForRelationshipMeta(this.store, meta));
|
11567
12184
|
|
11568
|
-
|
11569
|
-
|
11570
|
-
|
11571
|
-
|
11572
|
-
|
11573
|
-
|
12185
|
+
relationshipsForType.push({
|
12186
|
+
name: name,
|
12187
|
+
kind: meta.kind
|
12188
|
+
});
|
12189
|
+
}
|
12190
|
+
});
|
11574
12191
|
|
11575
|
-
|
12192
|
+
return map;
|
11576
12193
|
}).readOnly();
|
11577
12194
|
|
11578
12195
|
var ember$data$lib$system$relationships$ext$$relatedTypesDescriptor = Ember.computed(function() {
|
@@ -11591,7 +12208,7 @@
|
|
11591
12208
|
meta.key = name;
|
11592
12209
|
type = ember$data$lib$system$relationship$meta$$typeForRelationshipMeta(this.store, meta);
|
11593
12210
|
|
11594
|
-
Ember.assert("You specified a hasMany (" + meta.type + ") on " + meta.parentType + " but " + meta.type + " was not found.",
|
12211
|
+
Ember.assert("You specified a hasMany (" + meta.type + ") on " + meta.parentType + " but " + meta.type + " was not found.", type);
|
11595
12212
|
|
11596
12213
|
if (!types.contains(type)) {
|
11597
12214
|
Ember.assert("Trying to sideload " + name + " on " + this.toString() + " but the type doesn't exist.", !!type);
|
@@ -11765,12 +12382,15 @@
|
|
11765
12382
|
return null;
|
11766
12383
|
}
|
11767
12384
|
|
12385
|
+
var propertyMeta = this.metaForProperty(name);
|
11768
12386
|
//If inverse is manually specified to be null, like `comments: DS.hasMany('message', {inverse: null})`
|
11769
|
-
var options =
|
12387
|
+
var options = propertyMeta.options;
|
11770
12388
|
if (options.inverse === null) { return null; }
|
11771
12389
|
|
11772
12390
|
var inverseName, inverseKind, inverse;
|
11773
12391
|
|
12392
|
+
Ember.warn("Detected a reflexive relationship by the name of '" + name + "' without an inverse option. Look at http://emberjs.com/guides/models/defining-models/#toc_reflexive-relation for how to explicitly specify inverses.", options.inverse || propertyMeta.type !== propertyMeta.parentType.typeKey);
|
12393
|
+
|
11774
12394
|
//If inverse is specified manually, return the inverse
|
11775
12395
|
if (options.inverse) {
|
11776
12396
|
inverseName = options.inverse;
|
@@ -11818,7 +12438,7 @@
|
|
11818
12438
|
relationships = ember$data$lib$system$relationships$ext$$filter.call(relationships, function(relationship) {
|
11819
12439
|
var optionsForRelationship = inverseType.metaForProperty(relationship.name).options;
|
11820
12440
|
|
11821
|
-
if (!optionsForRelationship.inverse){
|
12441
|
+
if (!optionsForRelationship.inverse) {
|
11822
12442
|
return true;
|
11823
12443
|
}
|
11824
12444
|
|
@@ -12097,6 +12717,47 @@
|
|
12097
12717
|
invoking the callback with the name of each relationship and its relationship
|
12098
12718
|
descriptor.
|
12099
12719
|
|
12720
|
+
|
12721
|
+
The callback method you provide should have the following signature (all
|
12722
|
+
parameters are optional):
|
12723
|
+
|
12724
|
+
```javascript
|
12725
|
+
function(name, descriptor);
|
12726
|
+
```
|
12727
|
+
|
12728
|
+
- `name` the name of the current property in the iteration
|
12729
|
+
- `descriptor` the meta object that describes this relationship
|
12730
|
+
|
12731
|
+
The relationship descriptor argument is an object with the following properties.
|
12732
|
+
|
12733
|
+
- **key** <span class="type">String</span> the name of this relationship on the Model
|
12734
|
+
- **kind** <span class="type">String</span> "hasMany" or "belongsTo"
|
12735
|
+
- **options** <span class="type">Object</span> the original options hash passed when the relationship was declared
|
12736
|
+
- **parentType** <span class="type">DS.Model</span> the type of the Model that owns this relationship
|
12737
|
+
- **type** <span class="type">DS.Model</span> the type of the related Model
|
12738
|
+
|
12739
|
+
Note that in addition to a callback, you can also pass an optional target
|
12740
|
+
object that will be set as `this` on the context.
|
12741
|
+
|
12742
|
+
Example
|
12743
|
+
|
12744
|
+
```javascript
|
12745
|
+
App.ApplicationSerializer = DS.JSONSerializer.extend({
|
12746
|
+
serialize: function(record, options) {
|
12747
|
+
var json = {};
|
12748
|
+
|
12749
|
+
record.eachRelationship(function(name, descriptor) {
|
12750
|
+
if (descriptor.kind === 'hasMany') {
|
12751
|
+
var serializedHasManyName = name.toUpperCase() + '_IDS';
|
12752
|
+
json[name.toUpperCase()] = record.get(name).mapBy('id');
|
12753
|
+
}
|
12754
|
+
});
|
12755
|
+
|
12756
|
+
return json;
|
12757
|
+
}
|
12758
|
+
});
|
12759
|
+
```
|
12760
|
+
|
12100
12761
|
@method eachRelationship
|
12101
12762
|
@param {Function} callback the callback to invoke
|
12102
12763
|
@param {any} binding the value to which the callback's `this` should be bound
|
@@ -12123,8 +12784,8 @@
|
|
12123
12784
|
// support RSVP 2.x via resolve, but prefer RSVP 3.x's Promise.cast
|
12124
12785
|
Ember.RSVP.Promise.cast = Ember.RSVP.Promise.cast || Ember.RSVP.resolve;
|
12125
12786
|
|
12126
|
-
Ember.runInDebug(function(){
|
12127
|
-
if (Ember.VERSION.match(/1\.[0-7]\./)){
|
12787
|
+
Ember.runInDebug(function() {
|
12788
|
+
if (Ember.VERSION.match(/1\.[0-7]\./)) {
|
12128
12789
|
throw new Ember.Error("Ember Data requires at least Ember 1.8.0, but you have " +
|
12129
12790
|
Ember.VERSION +
|
12130
12791
|
". Please upgrade your version of Ember, then upgrade Ember Data");
|
@@ -12142,9 +12803,13 @@
|
|
12142
12803
|
ember$data$lib$core$$default.attr = ember$data$lib$system$model$attributes$$default;
|
12143
12804
|
ember$data$lib$core$$default.Errors = ember$data$lib$system$model$errors$$default;
|
12144
12805
|
|
12806
|
+
ember$data$lib$core$$default.Snapshot = ember$data$lib$system$snapshot$$default;
|
12807
|
+
|
12145
12808
|
ember$data$lib$core$$default.Adapter = ember$data$lib$system$adapter$$Adapter;
|
12146
12809
|
ember$data$lib$core$$default.InvalidError = ember$data$lib$system$adapter$$InvalidError;
|
12147
12810
|
|
12811
|
+
ember$data$lib$core$$default.Serializer = ember$data$lib$system$serializer$$default;
|
12812
|
+
|
12148
12813
|
ember$data$lib$core$$default.DebugAdapter = ember$data$lib$system$debug$$default;
|
12149
12814
|
|
12150
12815
|
ember$data$lib$core$$default.RecordArray = ember$data$lib$system$record_arrays$record_array$$default;
|