1

Angular を使用し、オフライン ストレージに ydn-db を使用してオフライン HTML ページを作成しています。

私はそのようなデータベースサービスを持っています、

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.

私はこの o StackOverflow のような質問をしましたが、何も機能していないように見えるか、間違った場所を探していたのかもしれません。

4

1 に答える 1

0

データベース要求は非同期であるため、コードの実行終了後に実行されます。

そのため、最後のalert実行時、self はまだ定義されていません。db リクエスト完了後に2 番目alertに実行される、通常の正しい設計パターンです。

編集:

次のコードで成功しました:

// 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で入手できます

デモアプリの実行はこちら: http://dev.yathit.com/demo/feature-matrix/index.html

于 2013-10-04T10:23:16.937 に答える