【问题标题】:Duplicate identical object复制相同的对象
【发布时间】:2015-11-30 13:03:48
【问题描述】:

我找到的这个问题的解决方案都没有让我满意。

我有一个创建、删除和复制项目的控制器。每当我复制一个项目时,它们显然具有相同的属性。然而,我希望能够区分和识别它们。此外,重复的项目需要在原始项目之后插入。

我想出了一些非常简单的解决方案:

  1. 生成唯一键并将其分配给创建的项目。
  2. 有一些 id 计数器,每个必须分配一个 ID 的项目都会增加一个(与解决方案 1 大致相同;可能更快但不必要地污染代码)。
  3. 在数组中插入项目并重新渲染,以便它从 Angular 获得 $$hashKey

我想第一个解决方案将是最佳实践,因为我可以为此创建一个模块。第二种解决方案可能是最快的解决方案,但我不喜欢我需要一个计数器的事实。第三种解决方案似乎根本不是一个好主意,因为这违反了 Angular 的原则。

我不知道它是否有用,但这里有一个fiddle

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
    };   
}

【问题讨论】:

    标签: angularjs duplicates unique


    【解决方案1】:

    使用angular.copy。这将执行一个深度复制,它将被 Angular 识别为不同的对象。

    当您在本机 javascript 中复制整个对象时,问题在于您还复制了 angular 模型所基于的内部 id视图映射。

    这是您的 jsFiddle 的更新版本,您可以在其中看到它的实际效果。

    【讨论】:

    • 所以 JavaScript 知道当它们具有相同属性时要删除哪个对象???
    • @Pascal 实际上并没有,因为 Angular 为每个副本添加了不同的内部标识符。添加一些日志记录,您应该会在项目上看到 $$hashKey 属性。
    • 不过你说得对,如果这是纯原生 javascript,我的拼接将无法按预期工作。
    • @IfTrue 好的,所以这在 Angular 1.2.1 及更高版本中不起作用,其中身份肯定基于 $$hashkey。但是,Pascal 使用的是 angular 1.1.1,它必须以某种方式维护内部映射。我不会在这方面进一步深入,但这里有一个fiddle,您可以从角度 1.1.1 切换到 1.2.1 以展示不同的行为。更改依赖关系、包含 div 的 html 和控制器函数,并注意 1.2.1 将如何在复制时生成不同的 $$haskeys 并拒绝简单的复制。
    • @IfTrue 我不确定与 $$hashkey 相关的确切版本,但是是的,在 1.1.1 中它似乎不是,而在 1.2.1 中它是。我也很确定它仍然是最近的角度版本。我测试了这些特定版本,因为它们是 jsFiddle 上唯一可用的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多