从有角度的手表中调用一个函数

时间:2016-11-25 06:31:28

标签: javascript angularjs

如何从$ scope.watch函数中调用控制器中的函数? 我尝试这样的东西,但那不起作用

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

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

它给了我一个错误

TypeError: getNotificationCount is not a function

4 个答案:

答案 0 :(得分:1)

在角度范围内声明函数:

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

答案 1 :(得分:1)

您需要在调用之前定义getNotificationCount

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

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

答案 2 :(得分:0)

因为可变吊装。当你有一个稍后在代码中声明的函数表达式时,它只是提升变量声明并按照执行顺序将方法分配给它。

在您的情况下,声明了getNotificationCount变量,但稍后会为其分配一个函数引用。因此,要解决此问题,您需要在进行调用之前将函数表达式移动到某个位置,或者使用函数定义,例如 function getNotificationCount(){};

您可以阅读有关功能提升here

的更多信息

答案 3 :(得分: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。

但是如果你将getNotificationCount方法定义为函数表达式,那么

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

你不会收到错误。在设置执行顺序之前,将评估范围中的所有函数表达式。 无论是在$ scope之前还是之后定义函数都无关紧要。$ watch()。 因此,当您以这种方式定义方法时,编译器将首先评估所有方法定义,然后当执行顺序到达$ scope。$ watch语句时,它将具有要调用的getNotificationCount的函数定义。

在你的情况下,编译器甚至不知道var getNotificationCount右边的内容,直到它在$ scope之后执行它。$ watch执行(如果这甚至完成而没有抛出错误)