Angularjs 取消注册后重新注册$watch

Angularjs 取消注册后重新注册$watch,angularjs,watch,Angularjs,Watch,我有一个日期变量的ng模型。在更改该变量时,我想进行一些验证,在这些验证过程中,我可能会更改起始变量本身,并且为了确保我不会获得无限监视触发器,我会在之前取消监视注册,并在验证完成后重新注册 重新注册不起作用。我做错了什么 var watchStartTime = $scope.$watch('timeSelection.startTime', function(newValue, oldValue) { if (newValue === oldValue) return; va

我有一个日期变量的ng模型。在更改该变量时,我想进行一些验证,在这些验证过程中,我可能会更改起始变量本身,并且为了确保我不会获得无限监视触发器,我会在之前取消监视注册,并在验证完成后重新注册

重新注册不起作用。我做错了什么

var watchStartTime = $scope.$watch('timeSelection.startTime', function(newValue, oldValue) {
    if (newValue === oldValue) return;
    validateStartEndTime();
}, true);

function validateStartEndTime() {
    // De-register watch
    watchStartTime();

    // Do some stuff that might change timeSelection.startTime

    // Re-register watch
    watchStartTime();
}
我还尝试在重新注册时使用0设置超时,认为它可能有效,但没有

我知道timeSelection.startTime会发生变化,但$watch中的函数不会再次被调用


我遗漏了什么?

如@Nikos Paraskevopoulos$watch所述,$watch返回注销fn。 我认为你应该做如下的事情

var register = function() {
    var unregister = $scope.$watch('timeSelection.startTime', function(newVal, oldVal) {
        if (newVal === oldVal) {
            return;
        }

        unregister();
        validateStartEndTime();
        register();
    }, true);
};

register();

换零钱怎么样?或者只需检查您的Form.yourDate.error是否不存在并显示视觉提示/禁用任何发送功能?我正在使用bootstrap的日期选择器,出于某种原因,ng更改从未触发,但我想这是另一个问题。另外,startTime可能会从控制器中的某个位置更改,而不仅仅是从Guit更改,$watch返回的函数只是一个注销函数。要再次注册,您必须再次使用相同的参数调用$watch。有趣的是,我可以将整个$watch块放入一个函数中,并随时调用它?