简体   繁体   中英

Angular.js call jquery function in Directive

In my app i am trying to call $('#accountTable').dataTable(); this function in my controller. But I think it doesnt work like that in angular.js. Tried to call this function in my Directive but i did not work.

My Directive:

 'use strict' app.directive('dataTableDirective', function () { return { restrict: "A", link: function (scope, elem, attrs) { $('#accountTable').dataTable(); } } }); 

Angular uses JQuery under the hood if you have JQuery referenced. If you don't then it falls back on a slimmer version of JQuery called JQuery Lite. The elem argument to the link function is already a JQuery wrapped object representing the element your directive is attached to. Just call the plugin from there and it should work fine. It is best to avoid the classic JQuery selectors to navigate the DOM and instead lean on Angular to provide the elements you need.

Make sure you have JQuery referenced before Angular in your script references.

app.directive('dataTableDirective', function () {
  return {
    restrict: "A",
    link: function (scope, elem, attrs) {
      elem.dataTable();
    }
  };
});

Angular needs to know about changes when they happen. If you assign any events and need to update scope variables, you'll need to make sure that Angular knows about those changes by wrapping them in scope.$apply . For example:

app.directive('dataTableDirective', function () {
  return {
    restrict: "A",
    link: function (scope, elem, attrs) {
      elem.on('order.dt', function (e) {
        scope.something = 'someValue';
      }).dataTable();
    }
  };
});

The above code will set the something property on scope, but because the event was triggered outside of an Angular digest cycle, any UI bound to the something variable may not appear to update. Angular needs to be told of the change. You can make sure the change happens during a digest cycle like this:

app.directive('dataTableDirective', function () {
  return {
    restrict: "A",
    link: function (scope, elem, attrs) {
      elem.on('order.dt', function (e) {
        scope.$apply(function () {
          scope.something = 'someValue';
        });
      }).dataTable();
    }
  };
});

Then in your markup:

<table data-data-table-directive>
  <!-- table contents -->
</table>

@supr pointed this out in the comments. Note that the attribute is data-data-table-directive not data-table-directive . There is an HTML convention that you can begin arbitrary attributes with data- and Angular respects that and omits it. For example, you can put ng-click on an element or you can put data-ng-click on an element and they would both work the same. It also supports x-ng-click as another convention.

This is super relevant to you because it just so happens that your directive name begins with the word "data", so you'll need to double up on the data- in the beginning. Hopefully that makes sense.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM