У меня есть два контроллера, один из которых вложен внутри другого, оба используют 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. Не уверен, что я поступил неправильно.
благодаря
Хотя было бы лучше использовать 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;
});
};
}]);
Что-то вроде этого от дочернего контроллера должно работать: 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
}
$scope
такие вещи:ng-controller="TaskController as taskCtl"
не нужны, это должен быть толькоng-controller="TaskController"
.