Angularjs 如何让$watch对typeahead作出反应?

Angularjs 如何让$watch对typeahead作出反应?,angularjs,Angularjs,$watch似乎无法捕捉到由提前输入选择更改的值。我想让它对变化做出反应 $scope.vm = 1; $scope.$watch(function() { return $scope.vm }, alert('hi') ); <input type="text" ng-model="$scope.vm " typeahead="item as item.description for item in items | filter:$viewValue | limitTo:8

$watch似乎无法捕捉到由提前输入选择更改的值。我想让它对变化做出反应

  $scope.vm = 1; 
  $scope.$watch(function() { return $scope.vm }, alert('hi') );

<input type="text" ng-model="$scope.vm " typeahead="item as item.description for item in items  | filter:$viewValue | limitTo:8" class="form-control"/>
$scope.vm=1;
$scope.$watch(函数(){return$scope.vm},警报('hi');

$watch
的第二个参数是一个函数。您正在立即执行该函数,然后将
警报
的结果传递给
$watch
(不记得了,但可能为null或未定义)。您需要包装它:

  $scope.vm = 1; 
  $scope.$watch(function() { return $scope.vm }, 
                function(newValue, oldValue) { alert('hi'); } );
编辑


您不需要在html中包含
$scope
变量,它应该是
vm
。作用域隐式应用于标记。
$watch
的第二个参数是一个函数。您正在立即执行该函数,然后将
警报
的结果传递给
$watch
(不记得了,但可能为null或未定义)。您需要包装它:

  $scope.vm = 1; 
  $scope.$watch(function() { return $scope.vm }, 
                function(newValue, oldValue) { alert('hi'); } );
编辑

您不需要在html中包含
$scope
变量,它应该是
vm
。作用域隐式地应用于标记。

您有
ng model=“$Scope.vm”
,而它应该是
vm
,正如paulpdaniels所说,您需要在侦听器回调中包装
警报

此外,您可能会发现,将处理程序方法传递给select
属性上的
typeahead比在控制器中放置
$watch
函数更干净

html

控制器

$scope.change = function(vm){
   console.log('vm', vm);
}
您有
ng model=“$scope.vm”
而它应该是
vm
,正如paulpdaniels所说,您需要在侦听器回调中包装
警报

此外,您可能会发现,将处理程序方法传递给select
属性上的
typeahead比在控制器中放置
$watch
函数更干净

html

控制器

$scope.change = function(vm){
   console.log('vm', vm);
}


谢谢你的回复,但这并不能解决问题:另外,我认为你可以只写cb而不加函数,这里的例子,如果你感兴趣的话(floribon的回复):不起作用。我添加了一个测试表,只是为了证明$watch在我的示例代码中总体上是有效的:我不明白为什么javascript有两个位置?你只做了一次修复(我甚至不认为它会被执行。你也需要修复
example.js
文件。当然,你可以使用回调,但在你的情况下,你没有提供回调,你只是在一个地方提供方法调用的结果。Javascript。我编辑了一个引导Ui示例。用你的建议清理了它:你仍然ve
ng model=“$scope.vm”
感谢您的回复,但这并不能解决问题:另外,如果您感兴趣,我认为您可以只编写cb而不添加函数,这里有示例(floribon的回复):不起作用。我添加了一个测试表,只是为了证明$watch在我的示例代码中总体上是有效的:我不明白为什么javascript有两个位置?您只在其中一个位置进行了修复(我甚至不认为它会被执行。你也需要修复
example.js
文件。当然,你可以使用回调,但在你的情况下,你没有提供回调,你只是在一个地方提供方法调用的结果。Javascript。我编辑了一个引导Ui示例。用你的建议清理了它:你仍然ve
ng model=“$scope.vm”
删除了$scope-这实际上来自angular ui boostrap的示例。但无论如何,没有区别:您仍然有
ng model=“$scope.vm”
在那次突袭中。谢谢你的帮助。对不起,我自己应该会发现。你有没有试过在选择上使用typehead指令可用的
typeahead属性?使用它可能比在你的控制器上添加
$watch
函数更干净,这通常是一种代码味道。只是一个想法。我有,应该有d、 只是为了避免将函数传递给指令。但实际上,我可能会这样做。再次感谢您的帮助。删除了$scope-这实际上来自angular ui boostrap的示例。但无论如何,没有区别:您仍然有
ng model=“$scope.vm”
在那次突袭中。谢谢你的帮助。对不起,我自己应该会发现。你有没有试过在选择上使用typehead指令可用的
typeahead属性?使用它可能比在你的控制器上添加
$watch
函数更干净,这通常是一种代码味道。只是一个想法。我有,应该有d、 只是为了避免将函数传递给指令。但实际上,我可能会以这种方式重做。再次感谢您的帮助。