AngularJS中准备好的文档

问题描述 投票:4回答:4

我想在单击复选框时触发一些jQuery代码。问题是,当我第一次在页面加载时单击选择框时,什么也没有发生。但是当我再次单击时,将执行jQuery代码。我尝试如下设置angular.element(ready),但它不起作用:

angular.element(document).ready(function() {
        $http.get($rootScope.appUrl + '/nao/test/test')
            .success(function(data, status, headers, config) {
                $scope.test = data.data;
        });
        $scope.testa = function() {
                $('.checkboxfisk').click(function() {
                var fish = $(this).attr('id');
                alert(fish);    
                });

        };
});

<tr ng-repeat="info in test"><td>{{info.stracka}}</td><td>{{info.tid}}</td><td><input type="checkbox" id="{{info.id}}" class="checkboxfisk" ng-click="testa()"></tr>
javascript angularjs document-ready
4个回答
2
投票

与Angular中的DOM交互的正确方法是创建您自己的自定义指令。然后,您可以在指令的postLink函数中连接jQuery处理程序(Angular在加载时构建页面时运行)。页面准备就绪后,您的处理程序将在那里并等待。

看一下Angular的指令文档并试一试:

AnuglarJS: Developer Guide: Directives

不过,以您的示例为例,可能太多了。完全不需要jQuery监听click事件。您只需要删除函数定义周围的jQuery包装器,然后让Angular处理click事件本身即可:

$scope.testa = function(id) {
    alert(id);
};

然后修改您的ng-click属性以在表达式中传递ID:

<input type="checkbox" 
       id="{{info.id}}" 
       class="checkboxfisk" 
       ng-click="testa(info.id)">

0
投票

其第二次单击后运行的直接原因是,在ng-click处理程序中,您使用了jQuery click()函数,该函数将单击处理程序绑定在执行警报中。因此,在第一次单击后,您仅绑定了该函数,而不执行它。绑定之后,下一次单击将执行它。无论如何,就像之前所说的,应该使用指令来完成。


0
投票

呈示项目的Angular方式与“ On DOM Ready”不同,这就是为什么我们需要将它们视为2个独立的事物。

[Angular可以在DOM准备就绪后渲染项目,例如,如果存在AJAX调用($http.get),这可能会发生,这就是为什么建议使用指令的原因。

尝试这样的事情:

<body ng-controller="MainCtrl">
  <input type="checkbox" chk-Sample="" >

<script>

var myApp = angular.module('myApp', []);

myApp.controller('MainCtrl', ['$scope', function ($scope) {}]);

myApp.directive("chkSample", function() {
    return {
            restrict: "A", //A - means attribute
            link: function(scope, element, attrs, ngModelCtrl) {
               $(element).click(function() {
                 var fish = $(this).attr('id');
                 alert(fish);    
               });
            }
        };
});

...

通过每次将angele生成输入元素时将指令myApp.directive("chkSample",...声明为属性chk-Sample="",它将在指令中执行链接功能。


0
投票

我不确定这是否正确,但是下面的代码对我有用:-

    $timeout(function(){
     if(condition){
       /*
             code you want to execute */
        }

    });  
© www.soinside.com 2019 - 2024. All rights reserved.