3

我正在使用代理类,因为我拥有的数据是对存储我的对象的 Firebase 位置的引用,但我想表现得好像我拥有对象本身一样。我有一些工作正常的东西,但我想改进它,关键标准是减少重复。我怀疑通过检查 Map 类并使用 apply() 可能会发生一些事情,但我不知道该怎么做(或者是否有更好的解决方案)。

我认为,如果可以将解决方案推广到支持任何类,而不仅仅是 Map 类,那也会很有用。

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);    
4

2 回答 2

2

想我最后自己解决了。

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);        
    }
  }
}
于 2013-02-08T17:10:10.130 回答
1

我不认为我完全遵循你想要完成的事情。你能放弃代理而只使用这样的东西吗?

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() 将始终缓存最新数据(因为它订阅更新)。所以它会更快并且使用更少的带宽。

于 2013-02-07T17:50:08.220 回答