2013-02-07 2 views
3

내가 가진 데이터로 프록시 클래스를 사용하고 있습니다. 내 객체를 저장하는 Firebase 위치에 대한 참조이지만 객체 자체를 가지고있는 것처럼 행동하고 싶습니다. 나는 잘 작동하는 무언가를 가지고 있지만, 그것을 개선하고 싶습니다. 핵심 기준은 반복을 줄이는 것입니다. 나는 Map 클래스를 검사하고 apply()를 사용하여 무언가가 가능하다고 생각하지만, 어떻게해야하는지 (또는 더 좋은 해결책이 있다면) 어떻게해야할지 모른다.Firebase 용 일반 자바 스크립트

솔루션이 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);  

답변

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);   
    } 
    } 
} 
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()는 (업데이트를 구독하므로) 항상 최신 데이터를 캐시하는 반면 .once()는 요청할 때마다 서버에서 데이터를 검색하고 가져옵니다. 따라서 더 빨라지고 더 적은 대역폭을 사용할 수 있습니다.

+0

이 경우 작동하지 않습니다. 내가 뭘하려는 건 사용자 이벤트가 발생할 때지도 개체를 업데이 트하는 것입니다. – axzr

관련 문제