2013-10-04 50 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

相关问题