Javascript 当我自己造成了这件事时,如何忽视它?
我有一个自定义UI元素,链接到ngModel: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 //
scope:
{
ngModel : "="
}
附着模型的更改方式有两种:
$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计算,看看数组是否具有相同的值。当用户与我的指令交互太快时,这些差异计算会导致明显的性能问题。