wildember
Version:
一个方便、快捷连接野狗实时服务适配器。
180 lines (157 loc) • 6.29 kB
JavaScript
import Ember from 'ember';
import DS from 'ember-data';
// import firebase from 'firebase';
import WildemberAdapter from '../adapters/wildember';
import WildemberSerializer from '../serializers/wildember';
import forEach from 'lodash/collection/forEach';
export function initialize(/*application*/) {
let application = arguments[1] || arguments[0];
// 千万千万别忘记注册,否则在application中不起作用
application.register('adapter:-wildember', WildemberAdapter);
application.register('serializer:-wildember', WildemberSerializer);
// Monkeypatch the store until ED gives us a good way to listen to push events
if (!DS.Store.prototype._emberfirePatched) {
DS.Store.reopen({
_emberfirePatched: true,
/**
* 自动分页查询节点所有数据<br>
* 由于一次性查询的数据量有限制,如果数据量大不能一次性把当前节点所有数据查询出来,
* 只能通过分页方式查询。
* 野狗数据限制说明:https://docs.wilddog.com/guide/sync/data-limit.html
*/
// findAllPagination(store, typeClass, startPosition) {
// var typeClassTmp = typeClass;
// var adapter = store.adapterFor(typeClass);
// // var ref = adapter._getCollectionRef(typeClass);
// var ref = adapter._ref;
// //转换model名,通常转为复数形式
// typeClass = adapter.pathForType(typeClass);
// // store.modelFor(typeClass);
// //查询当前model下的数据
// ref = ref.ref(typeClass);
// var COUNT = 100;
// var totalResults = [];
// var queryFlag = true;
// var query = {
// startAt: startPosition, //this.get("startAt"),
// orderByChild: 'timestamp',
// limitToFirst: COUNT //每页显示的条数
// }
// // store.set('typeMaps.metadata', { 'isPagination':true } );
// var typeMaps = {
// metadata: {
// isPagination: false
// }
// }
// ref = adapter.applyQueryToRef(ref, query, typeMaps);
// var log = `DS: WildemberAdapter#findAll ${typeClass} to ${ref}`;
// return adapter._fetch(ref, log).then((snapshot) => {
// var results = [];
// snapshot.forEach((childSnapshot) => {
// var payload = adapter._assignIdToPayload(childSnapshot);
// // results.push(Ember.Object.create(payload));
// results.push(payload);
// });
// /*
// 每次获取100条记录,取最后一条作为下一页的开始,然后再查询下一页的数据,
// 只要下一页还有超过2条数据就继续分页查询,
// 直至查询完当前节点的所有数据。
// */
// var len = results.length;
// if (len < COUNT) { //最有一页不足100条,不需要再继续分页查询
// return results;
// } else {
// //最后一个元素
// var startPosition = results[len - 1].id; //
// return this.findAllPagination(store, typeClass, startPosition).then((list) => {
// var len = results.length-1; // len - 1目的是为了让后一页的第一条数据覆盖掉前一页的最后一条数据
// // 把后面的数据拼接上去,
// list.forEach((item) => {
// //后一页的第一个数据会覆盖到上一页的最后一个数据,完美解决了因为多获取一条数据导致重复的问题
// //https://coding.net/u/wilddog/p/wilddog-gist-js/git/tree/master/src/pagination#user-content-yi-kao-shang--ye-de-zui-hou--tiao-ji-lu-huo-qu-xia--ye-shu-ju
// // results[len++] = Ember.Object.create(item);
// results[len++] = item;
// });
// return results;
// });
// }
// }).catch(function(err) {
// console.error('operation is failed ', err);
// }); //_fetch
// // debugger;
// },
/**
* 查询某个节点个数
*/
count(store, typeClass) {
return this.findAllPagination(store, typeClass).then((results) => {
return results ? results.length : 0;
});
},
push() {
var result = this._super.apply(this, arguments);
var records = result;
if (!Ember.isArray(result)) {
records = [result];
}
forEach(records, (record) => {
var modelName = record.constructor.modelName;
var adapter = this.adapterFor(modelName);
if (adapter.recordWasPushed) {
adapter.recordWasPushed(this, modelName, record);
}
});
return result;
},
recordWillUnload(record) {
var adapter = this.adapterFor(record.constructor.modelName);
if (adapter.recordWillUnload) {
adapter.recordWillUnload(this, record);
}
},
recordWillDelete(record) {
var adapter = this.adapterFor(record.constructor.modelName);
if (adapter.recordWillDelete) {
adapter.recordWillDelete(this, record);
}
}
});
}
if (!DS.Model.prototype._emberfirePatched) {
DS.Model.reopen({
_emberfirePatched: true,
unloadRecord() {
this.store.recordWillUnload(this);
return this._super();
},
deleteRecord() {
this.store.recordWillDelete(this);
this._super();
},
ref() {
var adapter = this.store.adapterFor(this.constructor.modelName);
if (adapter._getAbsoluteRef) {
return adapter._getAbsoluteRef(this);
}
}
});
}
if (!DS.AdapterPopulatedRecordArray.prototype._emberfirePatched) {
DS.AdapterPopulatedRecordArray.reopen({
_emberfirePatched: true,
willDestroy() {
if (this.__firebaseCleanup) {
this.__firebaseCleanup();
}
return this._super();
}
});
}
DS.WildemberAdapter = WildemberAdapter;
DS.WildemberSerializer = WildemberSerializer;
}
export default {
name: 'application',
before: 'ember-data',
initialize
};