Javascript 为什么我的$watch只发过一次火?

Javascript 为什么我的$watch只发过一次火?,javascript,angularjs,angularjs-ng-include,Javascript,Angularjs,Angularjs Ng Include,我正在分解一些小部件,$watch表达式在一个文件中完美地工作,但现在我将相关的控制器部分移动到一个新的控制器中,并将标记移动到一个新的html中,$watch在初始化后只触发一次,但在编辑相关输入时不会触发 JS: 包装器的HTML格式: <ng-include src="'partials/getRecipientWidget.html'" ng-controller="getRecipientWidgetController" ng-init="recipie

我正在分解一些小部件,
$watch
表达式在一个文件中完美地工作,但现在我将相关的控制器部分移动到一个新的控制器中,并将标记移动到一个新的html中,
$watch
在初始化后只触发一次,但在编辑相关输入时不会触发

JS:

包装器的HTML格式:

<ng-include
    src="'partials/getRecipientWidget.html'"
    ng-controller="getRecipientWidgetController"
    ng-init="recipient=cert"> <!-- ng-init doesn't influence the bug. -->
</ng-include>

我怀疑有巫毒在进行?我留下了
nginit
,以明确我想要实现的目标:构建一个明显更复杂、可重用的小部件,在本例中,它将在
$scope.cert
上工作,作为它的
接收者

,这可能是因为
nginclude
将在包含的HTML上创建一个新的继承范围,因此,控制器中的
$scope.addressInput
getRecipientWidget.html


这不容易解释,但您应该将
ng controller
放在
getRecipientWidget.HTML
的HTML中(而不是放在上面包含它的div上),或者您可以使用
something.addressInput
等对象,而不是原始
addressInput
,这样可以避免对原始类型的引用问题(数字/字符串)。

ng include创建新范围

试试这个

<md-text-float ng-model="$parent.addressInput"></md-text-float>


只是为了好玩,当你注入rootscope并调用$watch时会发生什么?@dustmouse没有改变。完全相同的错误/行为。正如floribon在他的回答中所说,了解所谓的“点规则”。是的!非常感谢!
这里开始工作了。
)不确定要选择哪种解决方案,但有选择比我的bug更好:)选择第二种。在AngularJS中,使用点表示法被视为是一种最佳实践,并且始终如一地这样做意味着你不会让这个bug再次攻击你(或者你的同事会改变HTML)。我刚刚测试了第一个,并了解到(你可能会详细说明/添加到你的回答中)两个控制器最终都在同一范围内运行。将使用
something
和两个作用域(?)。使用点确实是安全的,但我建议两者都使用:听起来像
getRecipientWidgetController
必须是
getRecipientWidget.html
的控制器,因此没有理由将其分开。事实上,最干净的第三种解决方案是使用指令而不是ngInclude+controller,这正是他们所做的,也许是学习它们的好时机:)谢谢,但我想floribon在解释发生了什么方面做得很好。使用
$parent
可能是第三种选择。
<md-text-float ng-model="addressInput"></md-text-float>
<md-text-float ng-model="$parent.addressInput"></md-text-float>