2016-07-05 4 views
0

Когда страница загружается с первого раза, я получаю мой thingsList заполненный. Но тогда мне нужно выбрать опцию с ng-click, она запускает функцию doSomething(), которая становится новой thingsList. В режиме отладки я вижу, что есть новый список, но нет привязки и datatables, которые все еще показывают мне старый thingsList.Угловые Datatables ng-click не дает привязки (Угловой путь)

Я действительно хотел бы решить это без использования dtOptions.

Я использую довольно простой "угловой путь" с DataTables:

<tr ng-repeat="thing in thingsList"> 
    <td>{{thing.id}}</td> 
    <td>{{thing.name}}</td> 
</tr> 

и мой контроллер выглядит следующим образом:

.controller('ThingsController', ['$http', '$scope', function ($http, $scope) { 

    this.getThing = function() { 
     $http.get(....).then(
      function success(response) { 
       $scope.thingsList = response.data; 
      }, 
      function error(data) { 
       console.log(data); 
      } 
     ); 
    }; 

    this.getThings(); 


    this.doSomething = function (id) { 
     $http.get(....).then(
      function success(response) { 
       $scope.thingsList = response.data; 
      }, 
      function error(data) { 
       console.log(data); 
      } 
     ); 
    }; 

}]); 
+1

вы можете предоставить plunkr – Prianca

ответ

2

Попробуйте использовать

$scope.thingsList.splice(0); // clears the array without losing reference 
Array.prototype.push.apply($scope.thingsList, response.data); // inserts new data to existing array 

вместо $scope.thingsList = response.data; в doSomething функция.

+0

ну, как я уже сказал, я получаю новый массив 'thingList', когда ng-click запускает функцию. Но это не является обязательным для данных. Но все равно спасибо. – ottercoder

+0

Я думал, что ваша проблема может быть связана с ** заменой ** '$ scope.thingsList' на новый массив. Хотя вы можете видеть новые данные в отладчике, это не значит, что представление знает об изменении. Он все равно может ссылаться на старый массив. Мое решение гарантирует, что ссылка на массив не изменяется - обновляются только данные внутри него. – PJDev

+0

ОК, использовал ваше решение и поместил 'getThings' в ng-init. Теперь он работает – ottercoder

1

Так что я догадываюсь, почему это происходит потому, что функция getThings() вызывается каждый раз, когда используется контроллер. Вы можете изменить код контроллера таким образом и попробовать:

.controller('ThingsController', ['$http', '$scope', function ($http, $scope) { 

$scope.getThing = function() { 
    $http.get(....).then(
     function success(response) { 
      $scope.thingsList = response.data; 
     }, 
     function error(data) { 
      console.log(data); 
     } 
    ); 
}; 


$scope.doSomething = function (id) { 
    $http.get(....).then(
     function success(response) { 
      $scope.thingsList = response.data; 
     }, 
     function error(data) { 
      console.log(data); 
     } 
    ); 
}; 

}]); 

Теперь это решит вашу проблему в списке не обновляется, когда вы выбираете вариант с нг-клик, но ваш список не будут загружены default, когда вы загружаете страницу, поскольку getThings() не вызывается.

Мое предложение для этого было бы использовать использование нг-Init, как описано в ответе на этот вопрос: How to execute angular controller function on page load?

или еще лучше использовать $ scope.on таким образом, в вашем коде:

.controller('ThingsController', ['$http', '$scope', function ($http, $scope) { 

$scope.getThing = function() { 
    $http.get(....).then(
     function success(response) { 
      $scope.thingsList = response.data; 
     }, 
     function error(data) { 
      console.log(data); 
     } 
    ); 
}; 

$scope.$on('$viewContentLoaded', function() { 
    $scope.getThing(); 
}) 

$scope.doSomething = function (id) { 
    $http.get(....).then(
     function success(response) { 
      $scope.thingsList = response.data; 
     }, 
     function error(data) { 
      console.log(data); 
     } 
    ); 
}; 

}]); 

Если вы используете маршрутизацию, вы можете изменить «$ viewContentLoaded» на «$ routeChangeSuccess» для ng-route или «$ stateChangeSuccess», если вы используете ui-router. (Не беспокойтесь об этом, если вы не используете маршруты для изменения видов)

+0

есть много вещей. Но положил 'getThings' на' ng-init' действительно помог, спасибо. Одна вещь, которую я не понимаю, в режиме отладки (F12), я не вижу никаких вызовов 'getThings' после инициализации контроллера в любом случае. Что это на самом деле изменилось? – ottercoder

+0

Один простой способ узнать, действительно ли он называет его несколько раз, - это просто поместить в функцию console.log() внутри функции, чтобы вы могли видеть, сколько раз она была вызвана.Я предлагаю вам попробовать это и посмотреть, печатается ли инструкция внутри журнала каждый раз, когда вы запускаете ng-click. –

Смежные вопросы