У меня есть основной контроллер, в котором я хочу передать/транслировать событие
главный контроллер
.controller('gameCtrl', function(){
function moveToTileBy(moves)
{
var numberOfTiles = ctlr.board.tiles.length,
player = getCurrentPlayer(),
currentTileNumber = player.currentPositionTileNumber;
if((moves + currentTileNumber) > numberOfTiles)
{
// alert player not enough moves
return nextTurn();
}
// create a drag and drop
$scope.$emit('movePlayer', currentTileNumber);
$scope.$emit('activateTile', moves + currentTileNumber);
}
})
У меня также есть директива для ng-repeat
items, каждый элемент имеет изолированную область, единственным подключением которой к основному контроллеру является модель области.
директива
.directive('phTile', ['$rootScope', 'Drake', function ($rootScope, Drake) {
return {
restrict: 'A',
scope: {
tile: '@ngModel'
},
link: function (scope, element, attr) {
var elem = element[0];
console.log(scope.tile);
$rootScope.$on('movePlayer', function(){
console.log('root link move player ', arguments);
});
scope.$on('movePlayer', function(){ console.log('link scope move player', arguments);})
}
};
HTML
<div ng-controller="gameCtrl as ctlr">
<div ng-repeat="(i, tile) in ctlr.board.tiles" class="w3-col tile tile-{{tile.number}}" ng-repeat-end-watch="ctlr.resize()" ng-model="tile" ph-tile><span>{{tile.number}}</span></div>
</div>
Я хочу, чтобы указанное выше событие в контроллере запускало серию манипуляций с 1 или несколькими элементами DOM.
Дилемма, с которой я столкнулся, заключается в том, что я не уверен, как/где построить логику для прослушивания указанного события и продолжить логику для манипуляции с домом....
Должно ли это быть
1) В директивном контроллере
return {
restrict: 'A',
scope: {
tile: '=ngModel'
}, controller: function($scope){ $scope.$on('move', function(){ /* manipulate dom element */}); }
2) Или по ссылке
return {
restrict: 'A',
scope: {
tile: '=ngModel'
}, link: function(scope, element, attr){ scope.$on('move', function(){ /* manipulate dom element */}); }
Кроме того, мне нужно получить доступ к объекту «плитки» изолированной области и «элементу» директивы, чтобы продолжить манипулирование dom.