Skip to content

Commit bc703d6

Browse files
committed
初步完成适配器代码编写
1 parent 73387d7 commit bc703d6

21 files changed

Lines changed: 1488 additions & 5 deletions

File tree

addon/adapters/wildember.js

Lines changed: 820 additions & 0 deletions
Large diffs are not rendered by default.

addon/initializers/application.js

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import Ember from 'ember';
2+
import DS from 'ember-data';
3+
// import firebase from 'firebase';
4+
import WildemberAdapter from '../adapters/wildember';
5+
import WildemberSerializer from '../serializers/wildember';
6+
import forEach from 'lodash/collection/forEach';
7+
8+
export function initialize(/* application */) {
9+
// Monkeypatch the store until ED gives us a good way to listen to push events
10+
if (!DS.Store.prototype._emberfirePatched) {
11+
DS.Store.reopen({
12+
_emberfirePatched: true,
13+
14+
push() {
15+
var result = this._super.apply(this, arguments);
16+
var records = result;
17+
18+
if (!Ember.isArray(result)) {
19+
records = [result];
20+
}
21+
22+
forEach(records, (record) => {
23+
var modelName = record.constructor.modelName;
24+
var adapter = this.adapterFor(modelName);
25+
if (adapter.recordWasPushed) {
26+
adapter.recordWasPushed(this, modelName, record);
27+
}
28+
});
29+
30+
return result;
31+
},
32+
33+
recordWillUnload(record) {
34+
var adapter = this.adapterFor(record.constructor.modelName);
35+
if (adapter.recordWillUnload) {
36+
adapter.recordWillUnload(this, record);
37+
}
38+
},
39+
40+
recordWillDelete(record) {
41+
var adapter = this.adapterFor(record.constructor.modelName);
42+
if (adapter.recordWillDelete) {
43+
adapter.recordWillDelete(this, record);
44+
}
45+
}
46+
});
47+
}
48+
49+
if (!DS.Model.prototype._emberfirePatched) {
50+
DS.Model.reopen({
51+
_emberfirePatched: true,
52+
53+
unloadRecord() {
54+
this.store.recordWillUnload(this);
55+
return this._super();
56+
},
57+
58+
deleteRecord() {
59+
this.store.recordWillDelete(this);
60+
this._super();
61+
},
62+
63+
ref() {
64+
var adapter = this.store.adapterFor(this.constructor.modelName);
65+
if (adapter._getAbsoluteRef) {
66+
return adapter._getAbsoluteRef(this);
67+
}
68+
}
69+
});
70+
}
71+
72+
if (!DS.AdapterPopulatedRecordArray.prototype._emberfirePatched) {
73+
DS.AdapterPopulatedRecordArray.reopen({
74+
_emberfirePatched: true,
75+
76+
willDestroy() {
77+
if (this.__firebaseCleanup) {
78+
this.__firebaseCleanup();
79+
}
80+
return this._super();
81+
}
82+
});
83+
}
84+
85+
DS.WildemberAdapter = WildemberAdapter;
86+
DS.WildemberSerializer = WildemberSerializer;
87+
88+
}
89+
90+
export default {
91+
name: 'application',
92+
before: 'ember-data',
93+
initialize
94+
};

addon/mixins/waitable.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import Ember from 'ember';
2+
3+
export default Ember.Mixin.create({
4+
5+
init() {
6+
this._super.apply(this, arguments);
7+
// unresolved requests, used in testing
8+
this._reasons = 0;
9+
10+
if (Ember.testing) {
11+
this._registerWaiter();
12+
}
13+
},
14+
15+
16+
_incrementWaiters() {
17+
this._reasons++;
18+
},
19+
20+
21+
_decrementWaiters() {
22+
this._reasons--;
23+
},
24+
25+
26+
/**
27+
* The waiter calls this to determine if testing should wait. Override in
28+
* the implementing class if needed.
29+
*
30+
* @return {Boolean}
31+
* @private
32+
*/
33+
_shouldWait() {
34+
return this._reasons === 0;
35+
},
36+
37+
38+
/**
39+
* Wire up a waiter for this instance.
40+
*
41+
* @private
42+
*/
43+
_registerWaiter: function() {
44+
this._waiter = () => {
45+
return this._shouldWait();
46+
};
47+
Ember.Test.registerWaiter(this._waiter);
48+
},
49+
50+
});

0 commit comments

Comments
 (0)