0

私は状態の中にコントローラを作成しました。 angular.extend(self, {})の角度(1.5)のコンポーネントとサービスには、通常、この種の表記法が使用されます。 self.criteriaは、ブラウザ呼び出しself.getAgencies()を初期化し、例外を返すされているときに、ここでコントローラ内の角度uiルータ機能は機能ではありません

私の問題は、次のとおりです。

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()関数を置くが、それは何も変更しませんでした。

は、私はこのようなangular.extend(self, {})getAgencies()外を移動することによってそれの外に出た:

var self = this; 

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

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

私のコードは、それが私のためokですので、働いているが、私はときに、このコール私のself.getAgencies()が動作しない理由を理解したいと思いますコントローラーコンポーネントの内部でうまく動作し、できればそれを改善します。

角度1.5.0のangle-ui-router 0.2.18を使用しています。 ありがとうございます。

答えて

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(); 

代わりに、関数を呼び出しゲッターとポストponeを使用することができます。

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

この説明は素晴らしいです、どうもありがとうございました。 :) – Berhthun

関連する問題