使用jQuery更新复选框时,AngularJS不刷新

时间:2018-11-06 16:24:00

标签: jquery angularjs garlicjs

我有一个使用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的访问权限?

1 个答案:

答案 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?

其他阅读材料