为什么我的$watch只烧过一次

Why does my $watch only ever fire once?

本文关键字:一次 我的 watch 为什么      更新时间:2023-09-26

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

JS:

app.controller('getRecipientWidgetController', [ '$scope', function($scope) {
    console.log("controller initializing")
    var testReceivingAddress = function(input) {
        console.log("change detected")
    }
    $scope.$watch("addressInput", testReceivingAddress)
} ])

包装器的HTML:

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

partials/getRecipientWidget.html:的HTML

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

我怀疑有什么范围的伏都教在进行?我留下了ng-init来明确我想要实现的目标:构建一个明显更复杂、可重用的小部件,在本例中,它将作为recipient$scope.cert上工作。

这可能是因为ng-include将在包含的HTML上创建一个新的继承作用域,因此控制器中的$scope.addressInputgetRecipientWidget.html 中的$scope.addressInput不是相同的引用

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

ng-include创建新的作用域。

试试这个

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

Plunker示例