Дублировать идентичный объект

0

Ни одно из решений, которые я нашел для этого вопроса, не удовлетворяет меня.

У меня есть контроллер, который создает, удаляет и дублирует элементы. Всякий раз, когда я дублирую элемент, у них, очевидно, будут одинаковые свойства. Тем не менее я хочу уметь различать и идентифицировать их. Также дублированный элемент необходимо вставить сразу после исходного элемента.

Есть несколько действительно простых решений, которые я придумал:

  1. Создайте уникальный ключ и назначьте его созданному элементу.
  2. Имейте некоторый счетчик id, который увеличивает себя по одному каждому элементу, который должен быть присвоен идентификатор (более или менее такой же, как решение 1, возможно, быстрее, но излишне загрязняет код).
  3. Вставьте элемент в массив и повторно $$hashKey чтобы он получил $$hashKey из Angular.

Я полагаю, что первое решение было бы лучшей практикой, так как я могу создать для этого модуль. Второе решение, вероятно, будет самым быстрым решением, но мне не нравится тот факт, что мне нужен счетчик. Третье решение кажется не совсем хорошей идеей, поскольку это противоречит принципам Углового.

Я не знаю, пригодится ли это, но здесь скрипка.

HTML

<div ng-app ng-controller="MyCtrl">
    <div ng-repeat="item in items">
        <p>{{item.id}}</p>
        <input type="submit" ng-click="duplicateItem(item)" value="Duplicate"></input>
        <input type="submit" ng-click="removeItem(item)" value="Remove"></input>
    </div>
</div>

JavaScript:

var myApp = angular.module('myApp', []);

//myApp.directive('myDirective', function() {});
//myApp.factory('myService', function() {});

function MyCtrl($scope) {
    $scope.items = [
        {
            type: 'text',
            id: 'ID_1' },
        {
            type: 'text',
            id: 'ID_2' }
    ];

    $scope.duplicateItem = function(item) {
        $scope.items.push(item);
    };

    $scope.removeItem = function(item) {
        // Removes item
    };   
}
Теги:
duplicates
unique

1 ответ

1
Лучший ответ

Используйте angular.copy. Это будет выполнять глубокую копию, которая будет распознана угловым как другой объект.

Проблема, когда вы просто дублируете весь объект в собственном javascript, заключается в том, что вы также копируете внутренний идентификатор, на котором угловая база отображает его модель <->.

Вот обновленная версия вашего jsFiddle, где вы можете увидеть ее в действии.

  • 0
    Так что JavaScript знает, какой объект удалить, когда они имеют одинаковые свойства ???
  • 0
    @Pascal на самом деле они этого не делают, так как angular добавил отдельный внутренний идентификатор для каждой из копий. Добавьте $$hashKey журнал, и вы должны увидеть свойство $$hashKey для элементов.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню