Javascript 当我自己造成了这件事时,如何忽视它?

Javascript 当我自己造成了这件事时,如何忽视它?,javascript,angularjs,watch,Javascript,Angularjs,Watch,我有一个自定义UI元素,链接到ngModel: scope: { ngModel : "=" } 附着模型的更改方式有两种: 它是从外部更改的-在本例中,我希望更新自定义元素的UI 它是从内部更改的-在这种情况下,我想忽略这些更改,因为我的UI已经是最新的 我有一块手表: $scope.$watch("ngModel", function(newValue){ // here I have complex logic to traverse newValue //

我有一个自定义UI元素,链接到ngModel:

scope: 
{   
  ngModel        : "="
}
附着模型的更改方式有两种:

  • 它是从外部更改的-在本例中,我希望更新自定义元素的UI
  • 它是从内部更改的-在这种情况下,我想忽略这些更改,因为我的UI已经是最新的
  • 我有一块手表:

    $scope.$watch("ngModel", function(newValue){
    
    // here I have complex logic to traverse newValue
    // to see if it matches my current UI state
    // if it matches, then I return
    // if it does not match, then I sync my UI to the newValue 
    
    });
    
    我有一个函数可以将当前UI状态推送到模型:

    function pushSelectionToModel() {
        // some code
        $scope.ngModel = newState;
        // some code
    }
    
    一切正常,但当用户快速浏览我的UI指令时,每次都会触发ngModel watch。我用来检测newValue是否与当前UI状态匹配的代码相当复杂,因此会导致性能问题

    一个自然的解决方案似乎是在我刚刚调用
    pushSelectionToModel
    时忽略$watch。我不能在更新之前在
    pushSelectionToModel
    中禁用手表,并在更新之后启用,因为手表是在
    pushSelectionToModel
    退出之后执行的

    如何告诉Angular,对于某些特定的型号分配操作,我不想触发某些特定的$watch?

    以下是相关的简化版本


    本质上,我想防止在单击Apply按钮时调用两次
    updateUi()
    。但是这个例子被简化了,实际上我不能直接分配或比较
    innerName
    ngModel
    值,因为在我的实际代码中,由于一些转换,值不同。

    我通过添加以下语句解决了类似的问题:

    $scope.$watch('ngModel', function(newValue){
     if($scope.innerName !== newValue){
         // now execute code
    


    但这更像是一种解决办法……

    将问题通读两遍,但仍然很难想象到底发生了什么。可以包含一个fiddle吗?应该重写ngModelController.$render方法,而不是监视值。这是正确的approach@Code学徒-我用Plunkr更新了我的问题。@Pierre-谢谢你的提示,我将看看$render。是的,这也是我的第一个想法。如果这些值是原语,它就可以正常工作。但在我的例子中,ngModel和newValue实际上都是对象数组,它们的顺序可能不同,所以我必须进行diff计算,看看数组是否具有相同的值。当用户与我的指令交互太快时,这些差异计算会导致明显的性能问题。