2015-09-09 137 views
0

我对日期变量有ng-model。在更改该变量时,我想进行一些验证,在验证过程中,我可能会更改启动变量本身,并确保我无法获得无限监视触发器,我将取消注册此表,当验证结束时注册它。

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

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(); 
} 

我也尝试setTimeout与0重新注册,认为它可能工作,但它没有。

timeSelection.startTime更改(我知道这是事实)但$ watch中的函数不会再被调用。

我错过了什么?

+0

'ng-change'怎么样?或者只是检查'yourForm.yourDate。$ error'是否不存在(并显示可视提示/禁用任何“发送”功能?) –

+0

我使用引导程序的datePicker,由于某种原因,ng-change从未被触发,但是我猜这是一个单独的问题。 加上startTime可能会从控制器的某个地方改变,而不仅仅是GUI – AlexD

+2

'$ watch'返回的函数只是一个注销函数。要再次注册,您必须再次使用相同的参数调用'$ watch()'。 –

回答

0

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

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

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

register();