这个(貌似)ng-class的意外行为背后的解释是什么?

时间:2014-01-29 17:52:25

标签: javascript jquery angularjs

这是我创建的一个傻瓜:http://plnkr.co/edit/ZoKsO7wu5OvCYtwEi9Iy?p=preview

  • 点击列表中使用ng-repeat呈现的其中一个项目,例如a
  • 然后点击clear selection,在AngularJS之外使用jQuery清除选择。
  • 现在再次点击刚清除其选择的同一项目,在本例中为a

现在看来a无法选择。但是,可以选择列表中的其他项目(bc)。选择另一个项目并清除其选择后,可以再次选择a

为什么ng-class会出现意外行为?

1 个答案:

答案 0 :(得分:3)

我不会使用 jQuery ,但如果您仍然需要,那么您必须让 angular 知道您所做的任何修改。

你可能认为你清除了选择,但jQuery回调只是删除了类。从angular的角度来看,它仍处于选中状态,因此它不会触发ngClass watchExpression再次添加该类。

使用$scope.$apply()

  

$ apply()用于从角度框架外部以角度执行表达式。 (例如,来自浏览器DOM事件,setTimeout,XHR或第三方库)。

这是一个掠夺者:http://plnkr.co/edit/C6jcmfU8V4tab8oeDJES?p=preview

我将您的点击事件监听器移动到控制器中:

$('#removeSelection').click(function(){
  $scope.$apply(function(){
    $scope.selectedId = null;
  })
});

更好地使用内置角ngClick

<a ng-click="selectedId = null">Click to Clear Selection</a>