@DizzyJager

Как получить данные из элемента в AngularJs?

Есть контроллер с двумя массивами объектов, скажем, 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();
  • Вопрос задан
  • 4718 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
вам нужно реализовать директиву, которая будет отвечать за drag'n'drop объектов, и внутри организовать калбэки, которые можно задавать через scope. (например что-то типа on-drop). Для удобства настройки можно сделать несколько директив, и одну главную (читать про require).

Работать с элементами можно только в директивах, но директивы не должны ничего знать о вашей бизнес логике. То есть если у вас появляются конструкции вида angular.element(garage).scope() то это повод задуматься.

Должно получиться что-то такое:
<ul>
<li data-ng-repeat="car in Model.cars" data-draggable="car" data-draggable-item="car">{{car.modelName}}</li>
</ul>
<ul>
    <li data-ng-repeat="garage in Model.garages"  data-droppable="car" data-on-drop="doSomething">{{garage.name}}</li>
</ul>

атрибуты data-draggable и data-droppable будут отмечены тегами, что бы указать какие объекты можно тягать куда. Для вашей задачи можно и без этого.

// controller
$scope.doSomething = function (car, garage) {
    // ставим машинку в гараж, убираем ее из списка если хотим, или что-то еще...
    // контроллер в этом случае вообще ничего не знает о drag n drop, 
    // только о том что что-то нужно сделать с данными.
};
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kompi
@kompi
nullstack devoops
Кто мешает внутри moveCarToGarage(car, garage), пробежаться циклом по массиву данных и обновить совпадающие значения?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы