Angular JS 1.5 - я хочу общаться между угловыми JS-компонентами
Я пытаюсь разоблачить deletePhoto
а также editPhoto
методы businessPhotos
компоненты в verticalGrid
составная часть. Но кое-как это не доступно.
Любая помощь будет оценена, спасибо
photo.js
angular.module('business')
.component('businessPhotos', {
templateUrl: 'business/photos.html',
controller: [ function() {
var $ctrl = this;
$ctrl.editPhoto = function(photo) {
// code
};
$ctrl.deletePhoto = function(id) {
// code
};
}]
});
photo.html
<vertical-grid ng-if="$ctrl.business.provider_photos" cells="$ctrl.business.provider_photos" delete-photo="$ctrl.deletePhoto(id)" edit-photo="$ctrl.editPhoto(photo)"></vertical-grid>
вертикально-grid.js
angular.module('dashboard')
.component('verticalGrid', {
bindings: {
cells: '<',
deletePhoto: '&',
editPhoto: '&'
},
templateUrl: 'utils/vertical-grid.html',
selector: 'vertical-grid',
controller: ['$element', function($element) {
var $ctrl = this;
$ctrl.colGrid = [];
var numOfCols = 4;
var numOfCells = $ctrl.cells.length;
$ctrl.colCssClass = 'col-xs-3';
for (var i = 0; i < numOfCells; i++) {
var colIndex = i % numOfCols;
if (!$ctrl.colGrid[colIndex]) {
$ctrl.colGrid[colIndex] = [];
}
$ctrl.colGrid[colIndex].push($ctrl.cells[i]);
}
}]
});
вертикально-grid.html
<div class="provider-photos row">
<div class="{{$ctrl.colCssClass}}" ng-repeat="col in $ctrl.colGrid track by $index">
<div class="photo-outer-tile" ng-repeat="cell in col track by $index">
<div class="photo-tile">
<img ng-src="{{cell.tile_url}}">
<div class="photo-controls">
<a ng-click="$ctrl.deletePhoto(cell.id)" href="javascript:void(0);">Delete</a>
<a href="javascript:void(0);">Crop</a>
</div>
</div>
</div>
</div>
</div>
2 ответа
Для связи между контроллерами angularjs вы можете использовать service
(или factory
, что концептуально очень похоже).
Смотрите, например, здесь.
Вы можете распространять события в режиме реального времени от службы к контроллерам, используя $watch
концепция.
Более простой способ - использовать инъекцию $rootScope
в обоих контроллерах.
Ваши компоненты вложены. Дочерний компонент может вызывать функцию родителя с require
Пример:
.component('verticalGrid', {
require: {
parent: '^^businessPhotos'
},
controller: function () {
this.$onInit = function () {
this.parent.editPhoto();
};
},
$ onInit необходимо указать сказать angular ждать, пока компонент загрузится.
^^ businessPhotos будет ссылаться на локальный родительский компонент. Один ^ также возможно.