2016-11-25 19 views
4

$ scope.watch関数の中から自分のコントローラ内の関数を呼び出すにはどうすればよいですか? 私はこのような何かをしようと、それはそれは角度の範囲内で関数を宣言してくれエラーアングルウォッチから関数を呼び出す

TypeError: getNotificationCount is not a function 
+0

関数をtopに移動するか、スコープで宣言してみてください。 – Sravan

+0

あなたのgetNotificationCount(); $ scope.getNotificationCount();のようにする必要があります。あなたの関数の宣言は$ scope.getNotificationCount()= –

答えて

1

あなたがする必要があります呼び出す前にgetNotificationCountを定義してください。

var getNotificationCount = function(){ 
    console.log("called your function"); 
} 

$scope.$watch(function(){return self.user}, function (newVal, oldVal, scope){ 
    if (self.user) { 
    getNotificationCount(); 
    } 
}); 
+1

またはgetNotificationCountをそのままにしておき、 'function getNotificationCount(){console.log("関数 "); } 'getNotificationCount'をコードの先頭に載せます – tsuz

1

を与える

$scope.$watch(function(){return self.user}, function (newVal, oldVal, scope){ 
if (self.user) { 
    getNotificationCount(); 
    } 
}); 

var getNotificationCount = function(){ 
    console.log("called your function"); 
} 

を動作しません:

$scope.getNotificationCount = function(){ 
    console.log("called your function"); 
} 
+1

と同じでなければなりません。スコープフィールドとしてモデルで直接使用されていない関数を定義することは、スコープの汚染を招くため、推奨されません。ビュー内で直接使用されている場合(たとえば、ng-clickの場合など)、関数をスコープフィールドにする必要があります。 –

+0

@Michał、あなたは正しい@ @ OP、あなたの要件に応じてあなたのコードをリファクタリングします。つまり、ビューを通して参照があれば上記のコードを使用します。 – Rambler

0

これは可変ホイストのためです。後でコード内で宣言された関数式がある場合は、変数宣言を呼び出すだけで、実行順序に従ってメソッドを代入します。

あなたの場合、getNotificationCount変数は宣言されていますが、後で関数参照が割り当てられます。したがって、問題を回避するには、関数式を場所に移動してから、関数定義を使用するか、関数getNotificationCount(){}のように関数定義を使用する必要があります。

あなたは、現在のコードではhere

0
$scope.$watch(function(){return self.user}, function (newVal, oldVal, scope){ 
    if (self.user) { 
    getNotificationCount(); 
    } 
}); 

var getNotificationCount = function(){ 
console.log("called your function"); 
} 

を巻き上げ機能についての詳細を読むことができるが、問題は、あなたが関数getNotificationCountを宣言しようとしている方法である、あなたが割り当てによって関数を宣言しているスニペット。したがって、実行順序は、最初の$ scope。$ watchコードブロックが実行されるように設定され、完了すると変数宣言getNotificationCountが実行されます。

しかし、あなたはその後、

function getNotificationCount() { 
    console.log('calling your function') 
} 

、関数式としてあなたgetNotificationCountメソッドを定義する場合は、エラーを取得することはできません。スコープ内のすべての関数式は、実行順序が定位置に設定される前に評価されます。 $ scope()の前でも後でもこのように関数を定義するかどうかは関係ありません。 このようにメソッドを定義すると、コンパイラはまずすべてのメソッド定義を評価し、実行順序が$ scope。$ watchステートメントに達すると、getNotificationCountが呼び出す関数定義を既に持っています。

コンパイラは、$ scopeの後に実行するまでvar getNotificationCountの右側に存在するものを手前で知っていません。$ watchが実行されます(エラーをスローせずに完了する場合)

関連する問題