2013-10-04 81 views
1

我正在使用Angular構建脫機HTML頁面,並使用ydn-db進行脫機存儲。將一個函數的局部變量返回到另一個函數

我有像這樣一個數據庫服務,

demoApp.SericeFactory.database = function database() { 
    var database = { 
     dataStore: null, 
     admins: [], 
     students: [], 
     errors: [], 
     getadmindata: function(username) { 
      self = null, that = this 
      database.dataStore.get('admins', username).done(function(record) { 
       that.self = record; 
       return record; 
      }).fail(function(e) { 
       console.log(e); 
       database.errors.push(e); 
      }); 
      return self; //This does not change. 
     } 
    }; 

    database.dataStore = new ydn.db.Storage('DemoApp'); 

    angular.forEach(INITSTUDENTS, function(student) { 
     database.dataStore.put('students', student, student.matricno); 
    database.students.push(student); 
    }); 

    angular.forEach(INITADMINS, function(admin) { 
    database.dataStore.put('admins', admin, admin.username); 
    database.admins.push(admin); 
    }); 

    return database; 

我也有一個控制器,嘗試使用數據庫;

function AppCntl ($scope, database) { 
    var user = database.getadmindata('user'); //I get nothing here. 
} 

我都試過了, 我試圖做改變selfvar self 我試圖分裂功能,像這樣

rq = database.dataStore.get('admins', 'user'); 
rq.done(function(record), { 
    self = record; 
    alert(self.name) //Works. 
}); 
    alert(self) //Doesn't work. 

我已經經歷了這樣的問題了此操作系統的StackOverflow,但沒有任何事情似乎爲我工作,或者我剛剛找錯了地方。

回答

0

數據庫請求是異步的,因此它在代碼執行結束後執行。

所以當最後的alert執行時,self仍然是未定義的。 Secound alert在數據庫請求完成後執行,它是通常正確的設計模式。

編輯:

我有下面的代碼的成功:在https://github.com/yathit/feature-matrix

運行演示應用程序

// Database service 
angular.module('myApp.services', []) 
    .factory('database', function() { 
    return new ydn.db.Storage('feature-matrix', schema); 
    } 
}); 

// controller using database service 
angular.module('myApp.controllers', []) 
.controller('HomeCtrl', ['$scope', 'utils', 'database', function($scope, utils, db) { 
    var index_name = 'platform, browser'; 
    var key_range = null; 
    var limit = 200; 
    var offset = 0; 
    var reverse = false; 
    var unique = true; 
    db.keys('ydn-db-meta', index_name, key_range, limit, offset, reverse, unique) 
     .then(function(keys) { 
     var req = db.values('ydn-db', keys); 
     req.then(function(json) { 
      $scope.results = utils.processResult(json); 
      $scope.$apply(); 
     }, function(e) { 
      throw e; 
     }, this); 
     }); 
}]) 

完整的應用程序可在這裏:http://dev.yathit.com/demo/feature-matrix/index.html

+0

謝謝。我必須檢查使用if(!$ scope。$$階段){$ scope。$ digest();}雖然沒有工作。我返回數據庫,然後檢查它是否在範圍內完成。 – Bond

相關問題