Nano Hash - криптовалюты, майнинг, программирование

Angular ng-repeat обновляет вид, но не правильно, при изменении размера массива

Я знаю, что название вопроса знакомо SO. Я рассмотрел много вопросов и попробовал их решения, но почему-то я все еще застрял.

Ну, у меня есть массив A, который повторяется, чтобы сформировать строку полей ввода. У меня есть кнопка ADD, чтобы добавить новую строку, где я в основном помещаю фиктивный элемент в этот массив (чтобы его длина увеличивалась, а в пользовательском интерфейсе отображалась еще одна строка). Данные из поля ввода хранятся в самом массиве A в строке $index.

Ну, это все работает нормально. Но когда я удаляю строку (у меня есть еще одна кнопка для ее удаления). При удалении я передаю $index строки и делаю splice по этому индексу.

Я ожидал, что элемент с этим индексом будет удален, что приведет к удалению этой строки из пользовательского интерфейса. Но что происходит на самом деле:

Элемент удаляется из массива A, и одна строка также удаляется из пользовательского интерфейса. Но это не та строка, в которой была нажата кнопка УДАЛИТЬ. Скорее последняя строка удаляется из пользовательского интерфейса (независимо от того, где вы нажимаете УДАЛИТЬ).

Я без понятия, что происходит? Находил разные похожие вопросы, пробовал много чего, но ничего не получилось :(

Ниже приведен соответствующий код. В этом коде home является псевдонимом контроллера, т.е. controllerAs : home:

<div ng-repeat= "d in home.degrees track by $index" class="inline_block name_container">
         <div class="inline_block aw_div_first">
          <label>College/University/Board:</label></br>
          <input class="form-control pd-forms" type="text"  ng-model="home['degree'][$index]['college']" placeholder="College/University/Board"/>
         </div>
         <div class="inline_block aw_div">
          <label>Qualification:</label></br>
          <input class="form-control pd-forms" type="text"  ng-model="home['degree'][$index]['qual']" placeholder="Qualification"/>
         </div>
         <div class="inline_block aw_div">
          <label>Passing Year:</label></br>
          <input class="form-control pd-forms" type="text"  ng-model="home['degree'][$index]['year']" placeholder="Passing Year"/>
         </div>
         <div class="btn btn-primary inline_block aw_button" ng-click="home.addDegree($index, home['degree'][$index])" ng-if="$index === home.degrees.length - 1">+</div>
         <div class="btn btn-primary inline_block aw_button" ng-click="home.removeDegree($index)" ng-if="($index <= home.degrees.length - 1) && home.degrees.length > 1">-</div>
    </div>

Контроллер:

vm.degrees = [1]; //initialising array with one element to show one row initially

function addDegree(i, data){
            var degree ={};
            degree.college = data.college;
            degree.qual = data.qual;
            degree.year = data.year;
            vm.degrees[i] = degree;
            vm.degrees.push(1);
            console.log("current degrees : ", vm.degrees);
        }

        function removeDegree(i){
            vm.degrees.splice(i,1);
        }


Ответы:


1

Попробуйте это, это работает.

ДЕМО: ДЕМО

 <body ng-app="plunker" ng-controller="MainCtrl as home">
    <div ng-repeat= "d in home.degrees track by $index" class="inline_block name_container">
         <div class="inline_block aw_div_first">
          <label>College/University/Board:</label><br>
          <input class="form-control pd-forms" type="text"  ng-model="d.college" placeholder="College/University/Board"/>
         </div>
         <div class="inline_block aw_div">
          <label>Qualification:</label><br>
          <input class="form-control pd-forms" type="text"  ng-model="d.qual" placeholder="Qualification"/>
         </div> 
         <div class="btn btn-primary inline_block aw_button" ng-click="home.addDegree($index, d)" ng-if="$index === home.degrees.length - 1">+</div>
         <div class="btn btn-primary inline_block aw_button" ng-click="home.removeDegree($index)" ng-if="($index <= home.degrees.length - 1) && home.degrees.length > 1">-</div>
    </div>
  </body>

ЯВАСКРИПТ

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

app.controller('MainCtrl', function($scope) {
  var vm = this;

  vm.degrees = [{college:'a',qual:'at'},{college:'b',qual:'bt'}]; //initialising array with one element to show one row initially

vm.addDegree = function(i, data){  
console.log(data);
            var degree ={};
            degree.college = 'test';
             degree.qual = 'testq';
          //  degree.year = data.year;
          //  vm.degrees[i] = degree;
            vm.degrees.push(degree);
            console.log("current degrees : ", vm.degrees);
        }

       vm.removeDegree = function(i){
         console.log(i);   
            vm.degrees.splice(i,1);
            console.log(vm.degrees);
        }
});
20.07.2016
  • Плункер не работает, знак удаления не работает... У меня проблемы только с удалением. Дополнение у меня работает нормально 20.07.2016
  • Проверьте сейчас, измените функцию на vm. vm.removeDegree = функция (я) {} 20.07.2016
  • Пробовал это .. Это все еще показывает ту же проблему. U щелкает удалить знак на первой записи, удаляя последнюю запись. Чтобы лучше это увидеть, попробуйте ввести данные в каждое поле, а затем нажмите удалить 20.07.2016
  • Большой. Так, как я хотел, но не увидел существенных изменений в коде. Кроме того, мой вариант использования - связать данные полей ввода в массиве degrees. При нажатии ADD должна быть добавлена ​​пустая строка, а позже эти данные должны быть привязаны к этому индексу .... Разве это не возможно ?? 20.07.2016
  • Изменение html-страницы 20.07.2016
  • Вы можете очистить объект данных степени для массива, например, var Degree ={}; степень.колледж = ''; степень.qual = ''; 20.07.2016
  • Все еще глядя на него, обязательно приму его, если он поможет :) 20.07.2016
  • plnkr.co/edit/6mbGKDPcE0o6aZoCyER0?p=preview, отметьте эту кнопку.. добавлено, вы можете добавить в него новую строку и ввести там колледж и степень, нажать кнопку, я утешил там массив степеней. 20.07.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..