|
374 | 374 | return function postLink($scope, $elem, iAttrs, ctrl) {
|
375 | 375 | $scope.$watch('[dtOptions, dtColumns, dtColumnDefs]', function (newVal, oldVal) {
|
376 | 376 | if (newVal !== oldVal) {
|
377 |
| - ctrl.render($elem, ctrl.buildOptions(), _staticHTML); |
| 377 | + var newDTOptions = newVal[0], oldDTOptions = oldVal[0]; |
| 378 | + // Do not rerender if we want to reload. There are already |
| 379 | + // some watchers in the renderers. |
| 380 | + if (!newDTOptions.reload || newDTOptions.sAjaxSource !== oldDTOptions.sAjaxSource) { |
| 381 | + ctrl.render($elem, ctrl.buildOptions(), _staticHTML); |
| 382 | + } else { |
| 383 | + // The reload attribute is set to false here in order |
| 384 | + // to recall this watcher again |
| 385 | + newDTOptions.reload = false; |
| 386 | + } |
378 | 387 | }
|
379 | 388 | }, true);
|
380 | 389 | ctrl.showLoading($elem);
|
|
970 | 979 | */
|
971 | 980 | return {
|
972 | 981 | create: function (options) {
|
973 |
| - var oTable, _render = function (options, $elem, data, $scope) { |
| 982 | + var oTable, |
| 983 | + // Reloading data call the "render()" function again, so it |
| 984 | + // might $watch again. So this flag is here to prevent that! |
| 985 | + _watcherInitialized = false, _render = function (options, $elem, data, $scope) { |
974 | 986 | options.aaData = data;
|
975 | 987 | // Add $timeout to be sure that angular has finished rendering before calling datatables
|
976 | 988 | $timeout(function () {
|
|
1001 | 1013 | }
|
1002 | 1014 | _loadedPromise.then(_whenLoaded);
|
1003 | 1015 | }, _reload = function (fnPromise) {
|
1004 |
| - if (_loadedPromise) { |
1005 |
| - _loadedPromise.then(function () { |
| 1016 | + if (angular.isDefined(fnPromise)) { |
| 1017 | + if (_loadedPromise) { |
| 1018 | + _loadedPromise.then(function () { |
| 1019 | + _startLoading(fnPromise); |
| 1020 | + }); |
| 1021 | + } else { |
1006 | 1022 | _startLoading(fnPromise);
|
1007 |
| - }); |
| 1023 | + } |
1008 | 1024 | } else {
|
1009 |
| - _startLoading(fnPromise); |
| 1025 | + throw new Error('You must provide a promise or a function that returns a promise!'); |
1010 | 1026 | }
|
1011 | 1027 | };
|
1012 |
| - $scope.$watch('dtOptions.fnPromise', function (fnPromise) { |
1013 |
| - if (angular.isDefined(fnPromise)) { |
1014 |
| - _reload(fnPromise); |
1015 |
| - } else { |
1016 |
| - throw new Error('You must provide a promise or a function that returns a promise!'); |
1017 |
| - } |
1018 |
| - }); |
1019 |
| - $scope.$watch('dtOptions.reload', function (reload) { |
1020 |
| - if (reload) { |
1021 |
| - $scope.dtOptions.reload = false; |
1022 |
| - _reload($scope.dtOptions.fnPromise); |
1023 |
| - } |
1024 |
| - }); |
| 1028 | + if (!_watcherInitialized) { |
| 1029 | + $scope.$watch('dtOptions.fnPromise', function (fnPromise, oldPromise) { |
| 1030 | + if (fnPromise !== oldPromise) { |
| 1031 | + _reload(fnPromise); |
| 1032 | + } |
| 1033 | + }); |
| 1034 | + _watcherInitialized = true; |
| 1035 | + } |
| 1036 | + _reload($scope.dtOptions.fnPromise); |
1025 | 1037 | return _this;
|
1026 | 1038 | };
|
1027 | 1039 | return renderer;
|
|
1081 | 1093 | if (angular.isUndefined(_this.options.aoColumns)) {
|
1082 | 1094 | _this.options.aoColumns = DT_DEFAULT_OPTIONS.aoColumns;
|
1083 | 1095 | }
|
1084 |
| - $scope.$watch('dtOptions.sAjaxSource', function (sAjaxSource, oldAjaxSource) { |
1085 |
| - if (sAjaxSource !== oldAjaxSource) { |
1086 |
| - _setOptionsAndRender(_this.options, sAjaxSource, $elem, $scope); |
1087 |
| - } |
1088 |
| - }, true); |
1089 |
| - $scope.$watch('dtOptions.reload', function (reload, oldReload) { |
1090 |
| - if (reload !== oldReload) { |
1091 |
| - if (reload) { |
1092 |
| - $scope.dtOptions.reload = false; |
1093 |
| - _render(options, $elem, $scope); |
1094 |
| - } |
1095 |
| - } |
1096 |
| - }, true); |
1097 |
| - _setOptionsAndRender(_this.options, _this.options.sAjaxDSource, $elem, $scope); |
| 1096 | + _setOptionsAndRender(_this.options, _this.options.sAjaxSource, $elem, $scope); |
1098 | 1097 | return this;
|
1099 | 1098 | };
|
1100 | 1099 | return renderer;
|
|
0 commit comments