2014-07-09 64 views
1

我寫了一個工廠從當地的WebSQL讓裏面的數據進行訪問database.The代碼如下:angularjs數據不能在控制器

app.factory('readData', function() { 
var localData=[]; 
var data=[]; 
var db = openDatabase("here is ma database"); 
var selectAllStatement = "SELECT * FROM tablename"; 

    db.transaction(function (tx) { 
     tx.executeSql(selectAllStatement, [], function (tx, result) { 
      dataset = result.rows; 
      for (var i = dataset.length - 1; i >= 0; i--) { 
      data[i]=dataset.item(i); 

      }; 
       localData=data; 

      console.log(data); 
      return localData; 

     }); 

    }); 
return localData ;}); 

這家工廠是在控制器中使用,以獲得data.The代碼:

function tricoreContrller($scope, readData) {$scope.users = readData;console.log($scope.users);}tricoreContrller($scope, readData); 

我已經使用的console.log檢查數據是否在factory.I實際未來獲得導致從出廠控制檯而不是從controller.Plz電話我在哪裏,我錯了。我用LocalData作爲溫度變量來存儲數組「數據」中的數據。

回答

1

其實,如果這個值被異步檢索,你應該更好地返回promise,而不是聽到價值的變化。

此外,工廠應始終使用可在注入後調用的方法返回對象,而不是單個函數的結果。這不是factory應該如何工作。

我會重寫你的代碼是這樣的:

app.factory('readData', function ($q) { 

    var localData=[]; 
    var data=[]; 
    var db = openDatabase("here is ma database"); 
    var selectAllStatement = "SELECT * FROM tablename"; 

    // here starts your public API, that is the method you can invoke 
    return { 
    transaction: function() { 

     // initialize a deferred method 
     var deferred = $q.defer() 

     db.transaction(function (tx) { 
     tx.executeSql(selectAllStatement, [], function (tx, result) { 
      // you forgot about 'var' here 
      var dataset = result.rows; 

      for (var i = dataset.length - 1; i >= 0; i--) { 
      data[i]=dataset.item(i); 
      } 

      // set your data as the successful result of your promise 
      deferred.resolve(data) 

     }) 
     }) 

     // return the promise (that is, the async data) 
     return deferred.promise 
    } 
    } 

}) 

然後你就可以在某些控制器注入和檢索的結果是這樣的:

app.controller('myCtrl', function (readData) { 

    readData.transaction() 
    .success(function (data) { 
     console.log(data) 
    }) 
}) 

編輯:更新的代碼來解決錯位return.promise

+0

我試過你的代碼,但我得到一個錯誤「無法讀取屬性'成功'的未定義」你可以p租賃糾正它,因爲我是angularjs的新手,這個概念對我來說是非常新鮮的事物。 – user3300727

+0

你說得對,我放錯了'deferred.promise'的返回。 – domokun

+0

無論如何,爲了您自己的利益,您應該學會調試和解決這類小問題,否則您將永遠無法學習JavaScript – domokun

1

這看起來是一個工廠獲取數據異步的問題。在您的控制器中,您正在獲取數據,然後立即將其記錄下來,但在db.transaction調用完成之前,數據只是一個空列表。

即工廠將立即返回起始listData(它是[]),然後一旦db-call完成,它就會修改它。你的控制器不會等待這個。

您將希望在控制器中使用$ scope。$ watch用戶(除非您重寫工廠以使用promise),以查看它何時更新。如果你只是想在模板中使用它,這可能沒有必要,默認情況下,模板很好地處理promise,但如果你想在javascript中使用它,你需要觀察或讓工廠使用promise。

因此,與手錶:

$scope.$watch('user', function(newVal, oldVal) { 
    if (newVal !== oldVal) { 
     console.log('Value changed!', newVal) 
    } 
} 

隨着預訂沒有測試它現在:)