2014-09-20 13 views
1

나는 pouchDB에서 데이터를 가져 오려고 노력 중이며, 그것에 대한 팩토리를 썼습니다. 나는이각도 js 템플릿은 파우치 DB에서 변수를 보여주지 않습니다

$scope.drivers = dbFactory.get('2EC8999B-FC24-4AF6-A171-A43C8414C3D1'); 

을 수행 할 때

fac.factory('dbFactory',function(){ 
var db = new PouchDB('dbname'); 

return { 
    post: function(data){ 
     db.post({ 
     title: data 
     }, function (err, response) { 
      if(err){console.log(err)}; 
      console.log(response) 
      return response 
     }); 
    }, 
    get: function(date){ 
     db.get(date, function(err, doc) { 
      if(err){console.log(err)}; 
      console.log(doc); 
      return doc 

     }); 
    }, 

나는 JS 콘솔에서 데이터를 얻었으나, 템플릿의 변수는 {{드라이버}} 비어 있습니다.

Object_id: "2EC8999B-FC24-4AF6-A171-A43C8414C3D1" 
_rev: "1-5779e6518d996fddf8e38f2c436db506" 
drivers: Array[3] 0: "Martin" 1: "Vlada" 2: "Jan" length: 3 
__proto__: Array[0] 
__proto__: Object 

편집 : 지금 나는 공장에서만 변수를 볼 수 있지만 제어기에서는 볼 수 없다는 것을 알았습니다.

답변

1

JavaScript에서 비동기식이면 비동기 코드를 계속 작성해야합니다. 당신의 get 기능을 봐 :

get: function(date){ 
    db.get(date, function(err, doc) { 
     return doc 
    }); 
}, 

return doc 즉, 그것은 db.get에서 반환 get에서 반환하지 않습니다. 최상위 함수는 무효화 된 호출입니다. 하지만 JavaScript가 반환 값 을 동 기적으로 계산하기 때문에 비동기 콜백에서 복귀하더라도 여전히 void 반환이됩니다.. PouchDB에 익숙하지 않지만 문서를 스캔하면 Continuation Passing Style 만 지원하는 것처럼 보입니다. 즉, 결과를 얻는 방법은 콜백을 제공하거나 PouchDB 메서드에 대한 약속을 만드는 것입니다. 여기에 두 가지를 모두 수행하는 방법은 다음과 같습니다

콜백

// need to include $q dependency in your factory.. 

get: function(date){ 
    var deferred = $q.defer(); 
    db.get(date, function(err, doc) { 
     if(err){ 
      deferred.reject(err); 
     } else { 
      deferred.resolve(doc); 
     } 
    }); 
    return deferred.promise; 
}, 

// usage 
dbFactory.get('2EC8999B-FC24-4AF6-A171-A43C8414C3D1').then( 
    function onSuccess(doc){ 
     $scope.drivers = doc; 
    }, 
    function onError(err){ 
     $scope.drivers = null; 
    }); 

가 개인적으로, 나는 약속 스타일을 선호

get: function(date, callback){ 
    db.get(date, function(err, doc) { 
     // do whatever logic needs to be done beforehand, then... 
     if("function" === typeof callback){ 
      callback.call(null, err, doc); 
     } 
    }); 
}, 

// usage 
dbFactory.get('2EC8999B-FC24-4AF6-A171-A43C8414C3D1', function(err, doc){ 
    $scope.drivers = doc; 
}); 

약속. Angular 1.2 이전에는 UI를 약속에 직접 바인딩 할 수 있었고 자동으로 해결되었습니다. 1.2에서는이 기능을 선택해야합니다. 나는 옵트 인이 1.3에서 제거 될 것이라고 믿는다. 약속 스타일을 선호하는 이유는 작성한 서비스와 공장이 앵귤러 코어 라이브러리와 상당히 일치하기 때문입니다.

+0

고맙습니다. 지금 나는 그것을 이해한다 :] – user3676101

+0

문제 없어요! 다행히 도울 수있어. –

관련 문제