Firebase的通用Javascript代理
我使用一个代理类,因为我拥有的数据是对存储我的对象的Firebase位置的引用,但我想表现得好像我拥有对象本身一样。我有一些很好用的东西,但我想改进它,关键的标准是减少重复。我怀疑通过检查Map类并使用apply()可以实现某些功能,但我不知道如何实现这一点(或者是否有更好的解决方案) 我认为,如果该解决方案可以推广到支持任何类,而不仅仅是Map类,那么它也会很有用Firebase的通用Javascript代理,javascript,proxy-classes,firebase,Javascript,Proxy Classes,Firebase,我使用一个代理类,因为我拥有的数据是对存储我的对象的Firebase位置的引用,但我想表现得好像我拥有对象本身一样。我有一些很好用的东西,但我想改进它,关键的标准是减少重复。我怀疑通过检查Map类并使用apply()可以实现某些功能,但我不知道如何实现这一点(或者是否有更好的解决方案) 我认为,如果该解决方案可以推广到支持任何类,而不仅仅是Map类,那么它也会很有用 var Map = function() { ... }; var MapProxy = function(mapRef)
var Map = function() {
...
};
var MapProxy = function(mapRef) {
this.mapRef = mapRef;
};
Map.prototype.addToken = function(portrait, newLocation) {
...
};
Map.prototype.removeToken = function(token) {
...
};
Map.prototype.moveToken = function(token, newLocation) {
...
};
MapProxy.prototype.addToken = function(portrait, newLocation) {
var mapRef = this.mapRef;
mapRef.once('value', function(data) {
var map = new Map();
map.init(mapRef, data.val());
map.addToken(portrait, newLocation);
});
};
MapProxy.prototype.removeToken = function(token) {
var mapRef = this.mapRef;
mapRef.once('value', function(data) {
var map = new Map();
map.init(mapRef, data.val());
map.removeToken(token);
});
};
MapProxy.prototype.moveToken = function(token, newLocation) {
var mapRef = this.mapRef;
mapRef.once('value', function(data) {
var map = new Map();
map.init(mapRef, data.val());
map.moveToken(token, newLocation);
});
};
var mapProxy = new MapProxy(mapRef);
我不认为我完全明白你想要实现的目标。你能放弃代理,用这样的东西吗
var Map = function(mapRef) {
mapRef.on('value', function(snap) {
this.init(snap.val());
});
};
Map.prototype.init = function(data) {
// update internal state with new data from Firebase ...
};
...
由于每次mapRef上的数据更改时都会触发“值”,因此地图对象将始终具有最新的数据
值得注意的是,如果您需要定期获取最新的地图数据,您可能应该使用.on(),而不是.once()。once()将在每次请求时从服务器检索数据,而.on()将始终缓存最新的数据(因为它订阅更新)。所以它会更快,使用更少的带宽。我想我最终自己解决了这个问题
var FirebaseProxy = function(classToProxy, firebaseRef) {
var key,
self = this;
self.proxy = classToProxy;
self.firebaseRef = firebaseRef;
for (key in self.proxy.prototype) {
if (typeof self.proxy.prototype[key] === 'function') {
(function(inner_key) {
self[inner_key] = function ()
{
var args = arguments;
self.firebaseRef.once('value', function(data) {
var proxiedInstance = new self.proxy();
if (typeof proxiedInstance.init === 'function') {
proxiedInstance.init(self.firebaseRef, data.val());
}
proxiedInstance[inner_key].apply(proxiedInstance, args);
});
}
})(key);
}
}
}
这在这种情况下不起作用。我试图做的是在发生用户事件时更新映射对象。