Угловые Вложенные Контроллеры Доступ к повторным данным

0

У меня есть два контроллера, один из которых вложен внутри другого, оба используют ng-repeat, чтобы по существу массивы списков связанных данных. Я хотел бы получить доступ к одному из свойств в ng-repeat родительского контроллера в дочернем контроллере. Я новичок в Angular и не знаю, как это сделать, или если я приближаюсь к нему неправильно. Любое руководство будет полезно.

HTML

<div class="container" ng-app="myApp">
    <div class="task" ng-controller="TaskController as taskCtl" ng-repeat="task in tasks">
         {{task.name}}
         <ul>
             <li ng-controller="AttachmentController as attachmentCtl" ng-repeat="attachment in attachments">{{attachment.name}}</li>
         </ul>
    </div>
</div>

JS

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

app.controller('TaskController', ['$scope', function ($scope) {
    $scope.tasks = [{name:'thing1', id: '123456'}, ... ];
}]);

app.controller('AttachmentController', ['$scope', '$http', function ($scope, $http) {
   $scope.attachments = [];

   $scope.init = function init() {
      $http.get('/api/attachments&task_id=' + **HOW_DO_I_GET_TASK_ID_HERE** )
         .then(function(response) {
              $scope.attachments = response.data;
      });
   };

  $scope.init();
}]);

Я хотел бы загрузить вложения, поскольку они относятся к задачам на основе идентификатора задачи для данной итерации через ng-repeat. Не уверен, что я поступил неправильно.

благодаря

  • 0
    Так как вы используете $scope такие вещи: ng-controller="TaskController as taskCtl" не нужны, это должен быть только ng-controller="TaskController" .
  • 0
    @developer033 developer033 Спасибо ... не уверен, что понимаю, почему / как использование $ scope делает это ненужным. Можете ли вы уточнить это или каковы 2 пути?
Показать ещё 2 комментария
Теги:

2 ответа

1
Лучший ответ

Хотя было бы лучше использовать ng-repeat с фильтром во всех вложениях с данным идентификатором. С тех пор вы вызываете /api/attachments&task_id для каждой итерации задачи.

Или отправить список вложений непосредственно по вызову /api/tasks. Поэтому вы можете мгновенно их зацикливать при выполнении циклов задач без необходимости набирать их на каждой итерации.

Возможное решение в соответствии с вашим кодом:

<div class="container" ng-app="myApp">
    <div class="task" ng-controller="TaskController as taskCtl" ng-repeat="task in tasks">
         {{task.name}}
         <ul>
             <li ng-controller="AttachmentController as attachmentCtl" ng-repeat="attachment in getAttachments(task.id)">{{attachment.name}}</li>
         </ul>
    </div>
</div>


app.controller('AttachmentController', ['$scope', '$http', function ($scope, $http) {
       $scope.getAttachments = function(id) {
          $http.get('/api/attachments&task_id=' + id)
             .then(function(response) {
                  return response.data;
          });
       };
    }]);
  • 0
    Благодарю. Мне нравится ваша идея для вызова / api / tasks. В настоящее время API не работает таким образом, но я мог бы сделать тот, который работает довольно тривиально.
  • 0
    Если вы можете объединить 1 вызов API, чтобы также включить эти данные, вы сэкономите на скорости (поскольку вы загружаете все данные за один раз, не имея одного вызова rest для получения задач, и для каждой задачи другой вызов API, чтобы получить вложения ). Дайте мне знать, если вам нужна дополнительная помощь! :)
Показать ещё 1 комментарий
0

Что-то вроде этого от дочернего контроллера должно работать: HTML:

<div class="container" ng-app="myApp">
    <div class="task" ng-controller="TaskController" ng-repeat="task in tasks">
         {{task.name}}
         <ul>
             <li ng-controller="AttachmentController" ng-repeat="attachment in fetchAttachments(task)">{{attachment.name}}</li>
         </ul>
    </div>
</div>

JS Child Controller: этот fetchAttachments будет вызываться для каждой итерации родительского ngRepeat. Вам придется "вернуть" результат вызова Ajax этой функции, чтобы он работал.

$scope.fetchAttachments = function (task) {
    // call ajax 
    // return the result of ajax
}
  • 0
    Спасибо, что-то в этом роде должно работать :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню