Есть контроллер с двумя массивами объектов, скажем, Garages и Cars. Garage может содержать Car.
$scope.Model.Garages = garageService.getGarages();
$scope.Model.Cars = garageService.getCars();
Во View элементы Cars поддерживают перетаскивание в Garage, за это отвечают директивы 'data-draggable' и 'data-droptarget'
module.directive('draggable', ['$rootScope', function ($rootScope) {
return {
restrict: 'A',
link: function (scope, el, attrs, controller) {
el.attr("draggable", "true");
el.bind("dragstart", function(e) {
var id = el.attr('data-draggable');
e.dataTransfer.setData('text', id);
});
}
};
}]);
module.directive('droptarget', ['$rootScope', function ($rootScope) {
return {
restrict: 'A',
scope: {
onDrop: '&'
},
link: function(scope, el, attrs, controller) {
el.bind("drop", function (e) {
var sourceElementId = e.dataTransfer.getData("text");
var sourceElement = document.querySelector('[data-draggable="' + sourceElementId + '"]');
var targetElement = el;
scope.onDrop({src: sourceElement, dest: targetElement});
});
}
};
}]);
В конце перестаскивания нужно проапдейтить данные в контроллере: переместить объект из Cars в Garage. Для этого директива вызывает метод контроллера, передавая туда элементы Car и Garage.
<div class="car" ng-repeat="car in Model.Cars" data-draggable data-on-drop="moveCarToGarage(car, garage)"></div>
Какой лучший способ получить данные, к которым привязаны эти элементы, для того, чтобы проапдейтить контроллер?
На данный момент использую следующее решение (метод moveCarToGarage в контроллере) :
var carData = angular.element(car).scope().car;
var garageData = angular.element(garage).scope().garage;
garageData.Cars.push(carData);
$scope.apply();