2014-09-20 65 views
1

我試圖從pouchDB獲取數據,因此我爲它寫了工廠。Angular js模板不會顯示變量db db

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 

     }); 
    }, 

當我這樣做

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

我在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不從get返回,從db.get返回。你的頂級函數只是一個無效的調用。但是,即使您從異步回調中返回,您仍然會返回void,因爲JavaScript會同步返回。我不熟悉PouchDB,但是掃描文檔,它看起來像只支持Continuation Passing Style。這意味着獲得結果的方式是提供回調或者圍繞PouchDB方法創建一個承諾。以下是如何做到既:

回調

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

無極

// 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; 
    }); 

就個人而言,我更喜歡承諾的風格。在Angular 1.2之前,您可以將UI直接綁定到承諾,並自動解決。在1.2中,你必須選擇加入這個功能。我相信選擇加入將在1.3中被刪除。我更喜歡諾言風格的原因是因爲您編寫的服務和工廠與Angular核心庫保持了相當一致。

+0

非常感謝,工作很好。現在我明白了:] – user3676101 2014-09-20 17:51:54

+0

沒問題!很高興我能幫上忙 – 2014-09-20 21:27:04