【问题标题】:how to recover data from factory to controller angularjs如何从工厂恢复数据到控制器angularjs
【发布时间】:2015-01-17 03:32:52
【问题描述】:

我试图从函数 regresarUsr() 的调用中恢复纯数据,能够使用函数 log 记录数据,但无法从函数 regresarUsr() 内部将纯数据返回到控制器然后添加到 $scope.user 总是我 console.log() 来自控制器的数据我没有定义,但我需要实际的对象。

app.factory('MGAindexdb', function(jsonService) {
    //
    // App global database instance and schema
    //
    var db = new Dexie("MGADT");
    db.version(1).stores({
        // friends: "++id,name,shoeSize",
        users: "++id,usr_id,nombre,email,fb_email,registration_date,validated,membership,amount,last_access,key,is_logged_in,imagenDeUsuario,total,meQueda,gastoDia",
        categories: "++id,category_id,user_id,nameCat,desc",
        expenses: "++id,exp_id,user_id,cat_id,amount,comments,date"
    });
    db.open();

    //
    // Populate some data
    //
    function populateUser(u, c, e) {

        log("Populating some populateUser", "heading");
        return db.transaction("rw", db.users, db.categories, db.expenses, function () {

            var cat;
            var exp;
            u = u.data;
            // console.log(u);
            db.users.clear();
            db.categories.clear();
            db.expenses.clear();

            var img = u.imagenDeUsuario.split('"')[7];
            console.log('Hola :DDD');
            db.users.add({ usr_id: u.user_id, nombre: u.name, email: u.email, fb_email: u.fb_email, registration_date: u.registration_date, validated: u.validated, membership: u.membership_type, amount: u.amount, last_access: u.last_access, key: u.key, is_logged_in: u.is_logged_in, imagenDeUsuario: img, total: u.total, meQueda: u.meQueda, gastoDia: u.gastoDia});

            var path = 'categories';
            var categories = jsonService.getjson( c, path, e).then(function(d) {
                cat = d.categories;
                angular.forEach(cat, function(c) { 
                    db.categories.add({category_id: c.category_id, user_id: c.user_id, nameCat: c.name, desc: c.description});
                });
            });

            var path = 'expenses';
            var expenses = jsonService.getjson( c, path, e).then(function(d) {
                exp = d.expenses;
                angular.forEach(exp, function(e) { 
                    db.expenses.add({ exp_id: e.expense_id, user_id: e.user_id, cat_id: e.category_id, amount: e.amount, comments: e.comments, date: e.date});
                });
            });

            // Log data from DB:
            // db.users.orderBy('nombre').each(function (user) {
            //     log(JSON.stringify(user));
            // });
            // db.categories.orderBy('nameCat').each(function (cate) {
            //     log(JSON.stringify(cate));
            // });
            // db.expenses.orderBy('exp_id').each(function (expe) {
            //     log(JSON.stringify(expe));
            // });
        }).catch(function (e) {
            log(e, "error");
            console.log('Error de populateUser');
        });
    }

    function regresarUsr () {
        log("Regresando Data de Usr", "heading");
        return db.transaction("rw", db.users, function () {
            db.users.orderBy('nombre').each(function (user) {
                // console.log(user);
                // log(JSON.stringify(user));
                // console.log(user);
                // alert(Dexie.getByKeyPath(users, "nombre")); // Will alert ("Kalle");
                return user;
            });

        }).catch(function (e) {
            log(e, "error");
            console.log('Error de regresarUsr');
        });
    }



    //
    // Helpers
    //
    function log(txt, clazz) {
        var li = document.createElement('li');
        li.textContent = txt.toString();
        if (clazz) li.className = clazz;
        document.getElementById('log').appendChild(li);
    }

    return {
       open: open,
       populateUser: populateUser,
       regresarCat: regresarCat,
       regresarExp: regresarExp,
       regresarUsr: regresarUsr,
       log: log

    };

// End
});

app.controller('DashboardCtrl', function($http, $scope, jsonService, sesionesControl, MGAindexdb) {

   $scope.user= function() {

      // console.log(MGAindexdb.regresarUsr());
      MGAindexdb.regresarUsr().then(function(data) {
        console.log(data);

      })
      .catch(function (e) {
        log(e, "error");
      });
    }
});

【问题讨论】:

    标签: angularjs angularjs-scope indexeddb angularjs-service data-retrieval


    【解决方案1】:

    这是因为您在工厂返回值从服务器返回之前记录它,所以它是未定义的。您必须使用承诺等到工厂实际包含数据。在 Angular 中,您使用 $q 服务创建一个承诺。

    app.factory('MGAindexdb', function (jsonService, $q) {
        return {
            regresarUsr: function () {
                var deferred = $q.defer();
    
                db.transaction("rw", db.users, function () {
                    db.users.orderBy('nombre').each(function (user) {
                        deferred.resolve(user);
                    });
    
                }).
                catch (function (e) {
                    deferred.reject(e);
                });
                return deferred.promise;
            }
        }
    }
    

    现在,当您将 $scope.user 绑定到 MGAindexdb.regresarUsr 时,会为 $scope.user 分配一个称为 Promise 的占位符,并在服务器请求返回时自动解析。

    编辑

    从 Angular 1.2 开始,promise 在分配给范围变量时不会自动解析。所以你必须使用Service.asyncCall().then(resolve promise here)来手动解决promise。

    【讨论】:

    • 我实现了你的代码,只是重命名了我的代码以避免冲突,并添加了初始化 indexedDB 的部分并得到了 deferred.resolve(user);未定义
    • 这是实际代码:hastebin.com/ijuxutajah.coffee 在控制器中我得到了这个: $scope.runSamples2 = function() { var aux = MGAindexdbDos.regresarUsr();控制台日志(辅助); }
    • 我有一个拼写错误。你能再试一次吗? $scope.user = MGAindexdb.regresarUsr();您可以将 {{user}} 放在模板中,它应该在承诺解决时更新。
    • 我已经改变了它,但我没有得到值,所以我 console.log 它,我只得到对象:then、catch 和 finally 函数和更多属性
    • 我不确定您为什么没有得到实际值的解析。这是一个 jsfiddle,它等待一秒钟然后返回一个字符串。如您所见,值在结果中解析:jsfiddle.net/85yuqy57/1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    相关资源
    最近更新 更多