Skip to content

Commit 679426e

Browse files
committed
Fixes #68
1 parent 39f094c commit 679426e

File tree

6 files changed

+74
-26
lines changed

6 files changed

+74
-26
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
##### 0.9.1 - xx May 2014
22

33
###### Backwards compatible bug fixes
4+
- #68 - Async methods should honor methods on a resource definition.
45
- #69 - Failed requests should throw an error, not just return it
56
- #70 - Make `params` and `params.query` optional
67

dist/angular-data.js

+12-12
Original file line numberDiff line numberDiff line change
@@ -2218,12 +2218,11 @@ function processResults(utils, data, resourceName, queryHash) {
22182218
delete resource.pendingQueries[queryHash];
22192219
resource.completedQueries[queryHash] = new Date().getTime();
22202220

2221-
// Merge the new values into the cache
2222-
this.inject(resourceName, data);
2223-
22242221
// Update modified timestamp of collection
22252222
resource.collectionModified = utils.updateTimestamp(resource.collectionModified);
2226-
return data;
2223+
2224+
// Merge the new values into the cache
2225+
return this.inject(resourceName, data);
22272226
}
22282227

22292228
function _findAll(utils, resourceName, params, options) {
@@ -4479,9 +4478,11 @@ function _inject(definition, resource, attrs) {
44794478
}
44804479
}
44814480

4481+
var injected;
44824482
if (_this.utils.isArray(attrs)) {
4483+
injected = [];
44834484
for (var i = 0; i < attrs.length; i++) {
4484-
_inject.call(_this, definition, resource, attrs[i]);
4485+
injected.push(_inject.call(_this, definition, resource, attrs[i]));
44854486
}
44864487
} else {
44874488
if (!(definition.idAttribute in attrs)) {
@@ -4526,12 +4527,14 @@ function _inject(definition, resource, attrs) {
45264527
}
45274528
resource.saved[id] = _this.utils.updateTimestamp(resource.saved[id]);
45284529
definition.afterInject(definition.name, item);
4530+
injected = item;
45294531
} catch (err) {
45304532
$log.error(err);
45314533
$log.error('inject failed!', definition.name, attrs);
45324534
}
45334535
}
45344536
}
4537+
return injected;
45354538
}
45364539

45374540
/**
@@ -4595,18 +4598,15 @@ function inject(resourceName, attrs, options) {
45954598
_this = this;
45964599

45974600
try {
4601+
var injected;
45984602
if (!this.$rootScope.$$phase) {
45994603
this.$rootScope.$apply(function () {
4600-
_inject.apply(_this, [definition, resource, attrs]);
4604+
injected = _inject.apply(_this, [definition, resource, attrs]);
46014605
});
46024606
} else {
4603-
_inject.apply(_this, [definition, resource, attrs]);
4604-
}
4605-
if (_this.utils.isArray(attrs)) {
4606-
return attrs;
4607-
} else {
4608-
return this.get(resourceName, attrs[definition.idAttribute]);
4607+
injected = _inject.apply(_this, [definition, resource, attrs]);
46094608
}
4609+
return injected;
46104610
} catch (err) {
46114611
if (!(err instanceof this.errors.RuntimeError)) {
46124612
throw new this.errors.UnhandledError(err);

dist/angular-data.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/datastore/async_methods/findAll.js

+3-4
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@ function processResults(utils, data, resourceName, queryHash) {
99
delete resource.pendingQueries[queryHash];
1010
resource.completedQueries[queryHash] = new Date().getTime();
1111

12-
// Merge the new values into the cache
13-
this.inject(resourceName, data);
14-
1512
// Update modified timestamp of collection
1613
resource.collectionModified = utils.updateTimestamp(resource.collectionModified);
17-
return data;
14+
15+
// Merge the new values into the cache
16+
return this.inject(resourceName, data);
1817
}
1918

2019
function _findAll(utils, resourceName, params, options) {

src/datastore/sync_methods/inject.js

+9-8
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ function _inject(definition, resource, attrs) {
2222
}
2323
}
2424

25+
var injected;
2526
if (_this.utils.isArray(attrs)) {
27+
injected = [];
2628
for (var i = 0; i < attrs.length; i++) {
27-
_inject.call(_this, definition, resource, attrs[i]);
29+
injected.push(_inject.call(_this, definition, resource, attrs[i]));
2830
}
2931
} else {
3032
if (!(definition.idAttribute in attrs)) {
@@ -69,12 +71,14 @@ function _inject(definition, resource, attrs) {
6971
}
7072
resource.saved[id] = _this.utils.updateTimestamp(resource.saved[id]);
7173
definition.afterInject(definition.name, item);
74+
injected = item;
7275
} catch (err) {
7376
$log.error(err);
7477
$log.error('inject failed!', definition.name, attrs);
7578
}
7679
}
7780
}
81+
return injected;
7882
}
7983

8084
/**
@@ -138,18 +142,15 @@ function inject(resourceName, attrs, options) {
138142
_this = this;
139143

140144
try {
145+
var injected;
141146
if (!this.$rootScope.$$phase) {
142147
this.$rootScope.$apply(function () {
143-
_inject.apply(_this, [definition, resource, attrs]);
148+
injected = _inject.apply(_this, [definition, resource, attrs]);
144149
});
145150
} else {
146-
_inject.apply(_this, [definition, resource, attrs]);
147-
}
148-
if (_this.utils.isArray(attrs)) {
149-
return attrs;
150-
} else {
151-
return this.get(resourceName, attrs[definition.idAttribute]);
151+
injected = _inject.apply(_this, [definition, resource, attrs]);
152152
}
153+
return injected;
153154
} catch (err) {
154155
if (!(err instanceof this.errors.RuntimeError)) {
155156
throw new this.errors.UnhandledError(err);

test/integration/datastore/async_methods/findAll.test.js

+47
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,51 @@ describe('DS.findAll(resourceName, params[, options]): ', function () {
133133
assert.equal(lifecycle.serialize.callCount, 0, 'serialize should have been called');
134134
assert.equal(lifecycle.deserialize.callCount, 1, 'deserialize should have been called');
135135
});
136+
it('should return already injected items', function () {
137+
var u1 = {
138+
id: 1,
139+
name: 'John'
140+
},
141+
u2 = {
142+
id: 2,
143+
name: 'Sally'
144+
};
145+
146+
DS.defineResource({
147+
name: 'user',
148+
endpoint: 'users',
149+
methods: {
150+
fullName: function () {
151+
return this.first + ' ' + this.last;
152+
}
153+
}
154+
});
155+
156+
$httpBackend.expectGET(/http:\/\/test\.angular-cache\.com\/users\??/).respond(200, [u1, u2]);
157+
158+
DS.findAll('user').then(function (data) {
159+
assert.deepEqual(data, [
160+
DSUtils.deepMixIn(new DS.definitions.user[DS.definitions.user.class](), u1),
161+
DSUtils.deepMixIn(new DS.definitions.user[DS.definitions.user.class](), u2)
162+
]);
163+
angular.forEach(data, function (user) {
164+
assert.isTrue(user instanceof DS.definitions.user[DS.definitions.user.class], 'should be an instance of User');
165+
});
166+
}, function (err) {
167+
console.error(err.message);
168+
fail('Should not have rejected!');
169+
});
170+
171+
$httpBackend.flush();
172+
173+
assert.deepEqual(DS.filter('user'), [
174+
DSUtils.deepMixIn(new DS.definitions.user[DS.definitions.user.class](), u1),
175+
DSUtils.deepMixIn(new DS.definitions.user[DS.definitions.user.class](), u2)
176+
], 'The users are now in the store');
177+
178+
assert.equal(lifecycle.beforeInject.callCount, 2, 'beforeInject should have been called');
179+
assert.equal(lifecycle.afterInject.callCount, 2, 'afterInject should have been called');
180+
assert.equal(lifecycle.serialize.callCount, 0, 'serialize should have been called');
181+
assert.equal(lifecycle.deserialize.callCount, 1, 'deserialize should have been called');
182+
});
136183
});

0 commit comments

Comments
 (0)