我有一个使用AngularJS的HTML页面。
这基本上是一个列表,可以通过单击某些复选框进行过滤。
我想使用jQuery'garlic'插件来记住复选框状态。
该插件运行良好,除了AngularJS“看不到”复选框状态:未根据复选框状态过滤列表。即使不使用“大蒜”,我也有同样的问题,我是否可以做这样的事情:
$(document).ready(function() {
$('#my-checkbox-tracked-by-angular).attr('checked',true_or_false).change();
});
复选框本身已进行了可视更新,但未触发AngularJS。
触发AngularJS的唯一方法是使用click事件:
$(document).ready(function() {
$('#my-checkbox-tracked-by-angular).trigger("click");
});
AngularJS正在更新列表,但是click事件还将复选框切换到相反的状态,我不希望这样。
当在angular外部更新角度跟踪复选框时,是否有办法告诉Angular刷新?
注意:我也尝试过:
$scope.$apply();
但是$ scope是不确定的,尽管我的代码是在角度加载之后。 我有AngularJS V1.2.1。如何获得$ scope的访问权限?
答案 0 :(得分:2)
有没有一种方法可以告诉Angular在角度跟踪时刷新 复选框在angular之外更新了?
是的,有一种叫做“脏污检查”的东西可以帮助您达到目的(请参阅scope docs)。
为了告诉AngularJS进行脏检查,您可以执行$scope.$apply();
。像这样:
$(document).ready(function() {
$('#my-checkbox-tracked-by-angular').attr('checked',true_or_false).change();
// do dirty checking!
// wrap it inside $timeout in order to avoid Action Already In Progress
// you can laverage this in your app. Maybe it's not necessary,
// but that depends on your entire app architecture and interaction
// between all angularjs elements (controllers, directives, etc)
$timeout(function() {
$scope.$apply();
});
});
如果由于某种原因您无法执行此操作,则也许可以将其作为一种变通办法来两次触发click
事件。这不是最好的解决方案,当然也不是最干净的解决方案,但是它将成功。像这样:
$(document).ready(function() {
$('#my-checkbox-tracked-by-angular).trigger("click").trigger("click");
});
警告:
如果直接将AngularJS和jQuery混合使用以进行DOM操作,请谨慎操作,否则可能会变得一团糟。为了进一步了解原因,请阅读"Thinking in AngularJS" if I have a jQuery background?。
其他阅读材料: