2016-12-20 114 views
0

我在一个状态内创建了一个控制器。对于我们的角(1.5)组件和服务,我们通常使用这种符号和angular.extend(self, {})控制器内部的角度ui路由器功能不是一个功能

我在这里的问题是,当self.criteria正在初始化,浏览器调用self.getAgencies(),并返回一个例外:

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,角度为1.5.0。 谢谢你的帮助。

回答

1

因为当达到

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

此代码angular.extend功能尚未叫着呢,没有理由自我应该包含getAgencies功能。

为什么不事先初始化机构?

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

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

或者,你可以使用一个getter和推迟实施后调用该函数:

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

这种解释是伟大的,非常感谢你。 :) – Berhthun