0

データベースにクエリを実行し、カテゴリを返す角度サービスを作成しました。

(function() {
    'use strict';
     angular.module('budget')
           .service('CategoriesService', ['$q', CategoriesService]);

    function CategoriesService($q) {
        var self = this;
            self.loadCategories = loadCategories;
            self.saveCategorie = saveCategorie;
            self.datastore = require('nedb');
            self.db = new self.datastore({ filename: 'datastore/default.db', autoload : true});

        function saveCategorie (categorie_name) {
            var entry = {name: categorie_name,
                     type: 'categorie'}
            self.db.insert(entry);
        };

        function loadCategories () {
            self.db.find({type: 'categorie'}, function (err, docs) {
                var categories = docs;
                return categories;
            });
        };

        return {
            loadCategories: self.loadCategories,
            saveCategorie: self.saveCategorie
        };
    }
})();

内部でconsole.logを実行するfunction loadCategories()と、6つのオブジェクト(データベースからのオブジェクト)の配列が返されますが、関数の外ではundefined.

私はコントローラ経由で呼び出していますCategoriesService.loadCategories()

だから私は何かをしなければならないかもしれないと思うが、promiseそれについてはよくわからない。

このサービスから実際のデータを取得するにはどうすればよいですか?

4

2 に答える 2

1

まず、サービス ファクトリ レシピから何も返す必要はありません。メソッドをthis変数に割り当てるだけで済みます。

少なくとも、次のものが必要です。

// service.js

self.loadCategories = function() {
  var deferred = $q.defer();
  db.find({type: 'categorie'}, function (err, docs) {
    deferred.resolve(docs);
  });
  
  return deferred.promise;
};

// controller.js

service
  .loadCategories()
  .then(function(categories) {
    $scope.categories = categories;
  })
;

于 2015-12-09T15:27:02.837 に答える
1

最初に約束を返す必要があるので、もう1つ返すだけでいいです...

   function loadCategories () {
        // you need to return promise first and you can resolve your promise in your controller
        return self.db.find({type: 'categorie'}, function (err, docs) {
            var categories = docs;
            return categories;
        });
    };
于 2015-12-09T15:21:27.597 に答える