Добавление пользователей в выпадающий список не работает

0

Добрый вечер! Там проблема с добавлением пользователя в раскрывающийся список (используется ui-grid). Мне нужно нажать имя ввода по id в dd-список после нажатия кнопки "addNewPerson", если там нет такого имени в списке или вызвать "alert", если есть.

Здесь код, ответственный за создание списка dd в html:

<ui-select ng-model="person.selected" theme="select2" style="min-width:300px;">

<ui-select-match placeholder="Select a person in the list or search by name">{{$select.selected.name}}
        </ui-select-match>
        <ui-select-choices repeat="person in contacts | filter: {name: $select.search} track by $index">
            <div ng-bind-html="person.name | highlight: $select.search"></div>
        </ui-select-choices>
    </ui-select>

Кнопка и поле ввода:

<button type="button" id="addPerson" class="button" ng-  click="addNewPerson()">Add New Person</button>

<input id="name" class="form-control" placeholder="Enter your Name">

Массив объектов с полем "имя", который необходимо передать в список dd:

    $scope.contacts = [
    {name: "Han Solo"},
    {name: "ThetaSigma"},
    {name: "Ollie Reeder"},
    {name: "Amy McDonald"},
    {name: "PJ Harvey"},
    {name: "Sofie Marceau"},
    {name: "Arthur Zimmermann"},
    {name: "Michelle Dockery"},
    {name: "Xavier Dolan"}
];

И, наконец, пресловутая функция:

$scope.person = {};

    $scope.addNewPerson = function () {
    var nameInput = document.getElementById("name");

    for (var i=0; i <= $scope.contacts.length; i++) {

        if ($scope.contacts[i].name == nameInput.value.toLowerCase()) {
            alert("Error, the name entered already exists");
        }else{
            var obj1 = {name: nameInput.value};
            $scope.contacts.push(obj1);
        }
    }

};

Я пробовал различные формации функции, он ни толкает ничего, ни оповещения 10 раз, ни толкает имена правильно, но даже уже существующие, или 10 раз срабатывает и оповещения 10 раз после одного добавления.

Я инвалид. Пытался найти аналогичный q/a здесь, но безрезультатно. И извините за мой английский, это не мой родной язык.

Теги:
angular-ui-grid

3 ответа

1

Здесь работает пример codepen.

Сначала Измените html для ввода, чтобы использовать переменную области видимости:

<input ng-model="name" class="form-control" placeholder="Enter your Name">

и в контроллере:

$scope.name = "";
$scope.addNewPerson = function () {
  for (var i=0; i < $scope.contacts.length; i++) {

    if ($scope.contacts[i].name.toLowerCase() === $scope.name.toLowerCase()) {
        alert("Error, the name entered already exists");
        return;
    }
  }
  $scope.contacts.push({name: $scope.name});
};
  • 0
    Спасибо за ваш ответ, я попытался, как вы предложили, но у меня есть ошибка: не удается прочитать свойство 'name' undefined в Scope. $ Scope.addNewPerson И это происходит во всех дальнейших вариантах переписывания функции, предложенной @ Кевин Дреслер.
  • 0
    Извините, небольшое исправление ("<" вместо "<="). обновленный ответ
0

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

Посмотреть

<input ng-model="name" class="form-control" placeholder="Enter your Name">

контроллер

$scope.name = "";
$scope.addNewPerson = function () {
    var contactIndex = $scope.contacts.map(function (contact) {
        return contact.name.toLowerCase();
    }).indexOf($scope.name.toLowerCase());
    if (contactIndex === -1)
        $scope.contacts.push({name: $scope.name});
    else
        console.log("Error, the name entered already exists");
}

Несколько примечаний:

  • При работе с угловыми, никогда не обращайтесь к контроллерам DOM в режиме просмотра, вместо этого используйте директивы
  • Стиль функционального программирования сэкономит вам много информации
  • Использование console.log вместо предупреждения повышает производительность на ок. 9000%
  • 0
    Согласовано. Но предполагается, что этот код является примером кода, и в более крупном проекте OP будет использовать что-то вроде lodash или подчеркивания, что устранит необходимость прокручивать вашу собственную функцию, чтобы найти, существует ли имя. То же самое относится и к предупреждению ... предполагается, что он просто установит переменную области видимости, которая, в свою очередь, покажет / скроет какое-нибудь приятное сообщение в DOM
  • 1
    Вы правы в том, что это просто пример кода, но я думаю, что даже в примере кода вы можете увидеть практики разработки. Я не писал ни разу за последние 5 лет. Даже если ОП не нужны мои замечания, это может помочь кому-то улучшить их кодирование. Если бы ОП использовал lodash или подчеркивание, вопрос никогда не задавался бы, но я, безусловно, согласен с тем, что в какой-то момент сложности эти рамки следует использовать, когда это возможно. По моему мнению, это все о правильном уровне абстракции для работы, которая будет сделана.
Показать ещё 4 комментария
0

Вы ng-model для привязки нового имени пользователя:

<input id="name" class="form-control" placeholder="Enter your Name" ng-model="new_user_name">

Тогда в вашем js, вы должны вырваться из вашего шлюза:

$scope.person = {};

    $scope.addNewPerson = function () {
    var name = $scope.new_user_name || "";

    var match_found = false;
    for (var i=0; i <= $scope.contacts.length; i++) {

        if ($scope.contacts[i].name == name.toLowerCase()) {
            alert("Error, the name entered already exists");
            match_found = true;
            break;
        }
    }

    if (!match_found) {
            var obj1 = {name: name};
            $scope.contacts.push(obj1);
    }

};
  • 0
    Разве ваша логика не добавляет пользователя, если это имя найдено? он должен вырваться из метода (return), а не только из цикла. (см. мой ответ выше)
  • 0
    конечно, какой бы ОП ни хотел на самом деле. Я не был уверен, хочет ли он / она сделать больше после этого.
Показать ещё 1 комментарий

Ещё вопросы

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