2016-12-20 160 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