2016-02-09 3 views
1

У меня есть arraylist, который используется для отображения рабочего процесса запроса на отпуск. Если запрос на отпуск в настоящее время сохраняется как черновик, запрос добавляется в мой проект списка, однако, если он был отправлен из модальной формы, подлежащей утверждению, ее необходимо будет удалить из проекта списка и добавить в список утверждений. Мой вопрос заключается в том, что этот список является внешним по отношению к моей форме, и моя форма не знает индекса списка. Когда я обновляю свой запрос из проекта для утверждения, как его удалить из черновика списка и добавить его в утвержденный список, не зная индекса.angularjs удалить из массива без знания индекса

Первой мыслью, которая пришла на ум, было создание уникального атрибута с базой данных pk, например data-approval="7", и выбрать ее с помощью какой-либо функции jquery и удалить элемент из списка, но из того, что я прочитал, это isn угловой способ сделать что-то. Итак, не зная индекс, как удалить элемент из моего списка в angularjs?

Пример цикла.

<ul> 
    <li ng-repeat="e in pendingApprovals" data-approval="{{e.id}}"> 
     <div class="alert alert-info"> 
      <h5>{{e.title}}</h5> 
      <div> 
      {{e.type}}   
      </div>  
      {{e.start | date:'MM/dd/yyyy - hh:mm a'}} 
      {{e.end | date:'MM/dd/yyyy - hh:mm a'}}  
      <a ng-click="rejectClick(e.id)" class="btn btn-danger btn-xs btn-block"> 
       <i class="fa fa-thumbs-down fa-1"></i> 
       Reject          
      </a>      
      <a ng-click="approveClick($index, e.id)" class="btn btn-success btn-xs btn-block"> 
       <i class="fa fa-thumbs-up fa-1"></i> 
       Approve          
      </a>          
     </div> 
    </li> 
</ul> 

JS

modalInstance.result.then(function(formData) { 
      $http.post('./calendar/save.json', formData).then(
       function(response) {      
        if(formData.update) { 
         $scope.refresh(); 
         console.log('refresh') 
         angular.element(elem[0].querySelector('[data-unsubmitted="' + response.data.id + '"]')).remove(); 
        } else { 
         $scope.events.push(response.data); 
         $scope.pendingApprovals.push(response.data); 
        }          
       }, function(response) { 
        console.log('failure ' + response) 
        // called asynchronously if an error 
        // occurs 
        // or server returns response with an 
        // error status. 
       }); 
     }, function() { 
      $log.info('Modal dismissed at: ' + new Date()); 
     }); 
+0

Когда вы передаете свой объект рабочего процесса в виде модального вы передать весь объект? Если да, то он не содержит какой-то уникальный идентификатор? В любом случае вам нужно что-то, чтобы иметь возможность настроить таргетинг на этот конкретный объект рабочего процесса. Если у вас есть [array.filter] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter), вы сможете отфильтровать этот элемент/с. Фильтр позволит вам выполнять логику по всему объекту, используя любое свойство или свойства, чтобы определить, должно ли оно оставаться. 'pendingApprovals = pendingApprovals.filter (x => x.id! == e.id)'; – ste2425

+0

Я открываю модальный диалог, используя библиотеку fullcalendar. Мой список рабочих процессов является внешним по отношению к моему календарю. Я добавил код выше, чтобы показать, как я добавляю уникальный идентификатор для каждого из моих элементов списка, и этот идентификатор доступен мне в ответе $ http.post. Оттуда я потерялся. Я пробовал что-то подобное, но потерпел неудачу. querySelector ('[data-unsubmitted = "' + response.data.id + '"]')). remove(); –

+0

@ ste2425 также, мои $ scope.pendingApprovals, кажется, пустые во время моего ответа. См. Пример кода выше. –

ответ

3

Это выглядит так, будто фильтры, как @ ste2425 был на самом деле решение.

modalInstance.result.then(function(formData) { 
     $http.post('./calendar/save.json', formData).then(
      function(response) {      
       if(formData.update) { 
        $scope.refresh();     

        var items = $scope.pendingApprovals;     

        var item = $filter('filter')(items, {id: response.data.id}, true)[0];  

        var index = items.indexOf(item);   

        $scope.pendingApprovals.splice(index,1); 
       } else { 
        $scope.events.push(response.data); 
        $scope.pendingApprovals.push(response.data); 
       }          
      }, function(response) { 
       console.log('failure ' + response) 
       // called asynchronously if an error 
       // occurs 
       // or server returns response with an 
       // error status. 
      }); 
    }, function() { 
     $log.info('Modal dismissed at: ' + new Date()); 
    }); 

Я также нашел помощь от этого SO вопрос how to get index position of an array item in controller passing a value in angularjs

+0

Рад, что вы его отсортировали. Однако более эффективным способом (извините за боль) было бы отфильтровывать массив '$ scope.pendingApprovals' непосредственно с использованием собственного фильтра JavaScript. Вы используете сервисный фильтр 'filter'. См. Скрипку для примера. https://jsfiddle.net/vegxwpt6/ У вас есть доступ ко всему, что вам нужно, идентификатор элемента для удаления и полный список элементов, из которых вы хотите его удалить. – ste2425

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