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 のデータが変更されるたびに起動するため、マップ オブジェクトには常に最新のデータが含まれます。

定期的に最新の地図データが必要な場合は、おそらく .once() ではなく .on() を使用する必要があることに注意してください。.once() は要求するたびにサーバーからデータを取得しますが、.on() は常に最新のデータをキャッシュします (更新をサブスクライブするため)。したがって、より高速になり、使用する帯域幅が少なくなります。

于 2013-02-07T17:50:08.220 に答える