2013-10-04 3 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. 
} 

, 나는 self-var 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은 db 요청 완료 후 실행되며 평소 올바른 디자인 패턴입니다.

편집 :

내가 다음 코드로 성공 있습니다

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

전체 응용 프로그램을 사용할 수 데모 애플리케이션을 실행 https://github.com/yathit/feature-matrix

에서이 여기에 있습니다 :

+0

http://dev.yathit.com/demo/feature-matrix/index.html 감사합니다. 나는 if (! $ scope. $$ phase) {$ scope. $ digest();}를 사용하여 검사해야한다. 데이터베이스를 반환 한 다음 범위에서 완료되었는지 확인했습니다. – Bond