angular-ui-controller里面的router函数不是一个函数

angular-ui-router function inside controller is not a function

我在一个状态中创建了一个控制器。我们通常将这种表示法用于 angular (1.5) 组件和服务,并带有 angular.extend(self, {}).

我的问题是 self.criteria 初始化时,浏览器调用 self.getAgencies() 和 return 异常:

Error: self.getAgencies is not a function

(function (app) {
    'use strict';

    app.config(function ($stateProvider) {
        $stateProvider.state('app.invoice', {
            url: '/invoice'
            abstract: true,
            template: '<ui-view></ui-view>'
        })
        .state('app.invoice.list', {
            url: '/list?allMyParam',
            template: '<invoices criteria="$ctrl.criteria"></invoices>',
            controllerAs: '$ctrl',
            controller: function ($location) {
                var self = this;

                angular.extend(self,{
                    criteria: {
                        agencies: self.getAgencies()
                    },
                    getAgencies: function () {
                        if ($location.search().agencies) {
                            return undefined;
                        } else {
                            return ['foo', 'blah'];
                        }
                    }
                });
            }
        });
    });
})(angular.module('module', []));

我将 getAgencies() 函数置于标准原型初始化之上,但它没有改变任何东西。

我通过将 getAgencies() 移动到 angular.extend(self, {}) 之外来摆脱它,如下所示:

var self = this;

var getAgencies = function () {
    if ($location.search().agencies) {
        return undefined;
    } else {
        return ['foo', 'blah'];
    }
}

angular.extend(self, {
    criteria: {
        agencies: getAgencies()
    }
});

我的代码可以正常工作,所以对我来说没问题,但我想了解为什么我的 self.getAgencies() 在控制器组件内部的调用运行良好时无法正常工作,如果可以的话,我会做得更好。

我正在使用 angular-ui-router 0.2.18 和 angular 1.5.0。 感谢您的帮助。

因为当达到这个代码时

criteria: {
   agencies: self.getAgencies()
},

angular.extend函数还没有被调用,self没有理由包含getAgencies函数。

为什么不在事后初始化代理?

            angular.extend(self,{
                criteria: { },
                getAgencies: function () {
                    if ($location.search().agencies) {
                        return undefined;
                    } else {
                        return ['foo', 'blah'];
                    }
                }
            });

            self.criteria.agencies = self.getAgencies();

或者,您可以使用 getter 和 post-pone 调用函数:

        angular.extend(self,{
            criteria: { 
              get agencies() {
                if (!self._agencies) { 
                  self._agencies = self.getAgencies();
                }
                return self._agencies;
              }
            },
            getAgencies: ...
        });