Добрый вечер! Там проблема с добавлением пользователя в раскрывающийся список (используется 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 здесь, но безрезультатно. И извините за мой английский, это не мой родной язык.
Здесь работает пример 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});
};
Вышеупомянутые ответы прекрасны, я хотел бы добавить вариант использования функционального стиля программирования, поскольку я люблю это делать, и для меня он выглядит более чистым.
<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");
}
Несколько примечаний:
Вы 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);
}
};