控制器内部的 angular-ui-router 函数不是函数

Posted

技术标签:

【中文标题】控制器内部的 angular-ui-router 函数不是函数【英文标题】:angular-ui-router function inside controller is not a function 【发布时间】:2017-05-05 18:37:15 【问题描述】:

我在一个状态中创建了一个控制器。我们通常使用 angular.extend(self, ) 来表示我们的 angular (1.5) 组件和服务。

我的问题是当self.criteria被初始化时,浏览器调用self.getAgencies()并返回一个异常:

错误:self.getAgencies 不是函数

(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。 感谢您的帮助。

【问题讨论】:

【参考方案1】:

因为当到达这段代码时

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: ...
        );

【讨论】:

以上是关于控制器内部的 angular-ui-router 函数不是函数的主要内容,如果未能解决你的问题,请参考以下文章

Angular-ui-router路由,View管理

Angular-ui-router 详解

angular-ui-router 使用打字稿嵌套命名视图

Angular-ui-router 打字稿定义

停止 angular-ui-router 导航,直到 promise 解决

如何删除 angular-ui-router URL 中的“#”符号