2013-05-22 2 views
4

У меня есть код, который работает над добавлением и удалением записей в и из массивов в моем объеме. В настоящий момент код не используется повторно, а вырезается/вставляется и настраивается. Кроме того, он довольно naughtly использует наследование области для доступа к массиву. Я пытаюсь создать директиву, которая исправит эти две проблемы. Директива работает нормально, пока я добавляю записи в массив. Как только я удаляю запись, я, кажется, нарушаю двунаправленную привязку. Какие-нибудь подсказки относительно того, как я должен это делать?Как удалить из массива в угловой директиве

Fiddle is here.

Он показывает SkillsCtrl, который является старым кодом, и ListEditCtrl, который является новым (воспроизводится ниже со скрипки). Добавление записи в любой список будет обновлять оба, но удаление записи из одного из этих списков прерывает привязку.

function SkillsCtrl($scope) { 
    $scope.addSkill = function() { 
     $scope.profile.skills = $scope.profile.skills || []; 
     $scope.profile.skills.push($scope.newskill); 
     $scope.newskill = ""; 
    }; 

    $scope.removeSkill = function() { 
     $scope.profile.skills = _.without($scope.profile.skills, this.skill); 
    }; 
} 

function ListEditorCtrl($scope) { 
    $scope.addItem = function() { 
     $scope.list = $scope.list || []; 
     $scope.list.push($scope.newitem); 
     $scope.newitem = ""; 
    }; 

    $scope.removeItem = function() { 
     $scope.list = _.without($scope.list, this.item); 
    }; 
} 
+0

где находится ваш 'newitem' объект? –

+0

В шаблоне для директивы. – axzr

+0

Пожалуйста, добавьте директиву на свой вопрос от Fiddle –

ответ

4

Это потому, что вы используете http://underscorejs.org/#without, который создает копию массива, а не только удаление элемента. Когда вы удаляете элемент, новый массив будет связан с областью, а новый массив не связан с массивом в области выделения.

Для решения этой проблемы можно использовать вместо сращивания, который удаляет элемент из исходного массива:

$scope.removeSkill = function() { 
    $scope.profile.skills.splice(_.indexOf($scope.profile.skills, this.skill),1); 
}; 

...

$scope.removeItem = function() { 
    $scope.list.splice(_.indexOf($scope.list, this.item),1); 
}; 

Обновлено plunker: http://jsfiddle.net/jtjf2/

+1

Несколько раз я чувствую, что подчеркивание становится новым jQuery. Библиотеки для большинства тривиальных задач. – TheHippo

+0

Отлично, спасибо! – axzr

+0

Да, к сожалению, у IE8 нет 'indexOf()' в прототипе Array: / – joakimbl

Смежные вопросы