Angular-UI-Select ng-модель не работает с простой переменной в $ scope - PullRequest
1 голос
/ 14 апреля 2019

Как очистить массив с выбранными значениями, чтобы значения могли вернуться к выбору?

У меня есть массив людей.Значения массива people доступны в select.Когда я выбираю имена, они переносятся в массив multipleDemo.И вы не можете повторно выбрать их из выбора, потому что они исчезают и перемещаются в массив multipleDemo.С помощью кнопки Удалить мне нужно удалить все элементы из массива multipleDemo (кроме первого элемента) в массив людей.Так что вы можете снова выбрать имя из списка.Ошибка в функции $clearTag.

Ожидаемое поведение: Пример:

  1. Выбор: Владимир
  2. Появляется тег Wladimir
  3. Выбрать Владимира (Вы можетене выбирайте Владимира, потому что он уже выбран)
  4. Нажмите Удалить.Вырезать элементы (теги) с помощью массива множественных демо и поместить их в массив people
  5. Вы можете снова выбрать Wladimir

Вот мой код: http://plnkr.co/edit/TPZjXkkSRrIc5ApzP07F?p=preview

index.html

<!DOCTYPE html>
<html lang="en" ng-app="demo">
<head>
  <meta charset="utf-8">
  <title>AngularJS ui-select</title>

  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular-sanitize.js"></script>
  <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.css">

  <!-- ui-select files -->
  <script src="select.js"></script>
  <link rel="stylesheet" href="select.css">

  <script src="demo.js"></script>

  <!-- Select2 theme -->
  <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/select2/3.4.5/select2.css">
  <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.8.5/css/selectize.default.css">

  <style>
    body {
      padding: 15px;
    }

    .select2 > .select2-choice.ui-select-match {
      /* Because of the inclusion of Bootstrap */
      height: 29px;
    }

    .selectize-control > .selectize-dropdown {
      top: 36px;
    }
  </style>
</head>
<body ng-controller="DemoCtrl">

  <h3>Array of strings</h3>
  <button ng-click='clearTag()'>Delete</button>
  <ui-select tagging tagging-label="new tag" multiple ng-model="multipleDemo" 
  on-select="OnClickSelect($item)" on-remove="OnRemoveSelect($item)"
  theme="select2" ng-disabled="disabled" style="width: 300px;">
    <ui-select-match placeholder="Select name...">{{$item.name}}</ui-select-match>
    <ui-select-choices  repeat="item in people | filter:$select.search">
      {{item.name}}
    </ui-select-choices>
  </ui-select>
  <p>Selected: {{multipleDemo}}</p>
  <hr>  

</body>
</html>

demo.js

app.controller('DemoCtrl', function($scope, $http, $timeout) {
  $scope.multipleDemo =[];
    $scope.people = [
    { name: 'Adam',      email: 'adam@email.com',      age: 12, country: 'United States' },
    { name: 'Amalie',    email: 'amalie@email.com',    age: 12, country: 'Argentina' },
    { name: 'Estefanía', email: 'estefania@email.com', age: 21, country: 'Argentina' },
    { name: 'Adrian',    email: 'adrian@email.com',    age: 21, country: 'Ecuador' },
    { name: 'Wladimir',  email: 'wladimir@email.com',  age: 30, country: 'Ecuador' },
    { name: 'Samantha',  email: 'samantha@email.com',  age: 30, country: 'United States' },
    { name: 'Nicole',    email: 'nicole@email.com',    age: 43, country: 'Colombia' },
    { name: 'Natasha',   email: 'natasha@email.com',   age: 54, country: 'Ecuador' },
    { name: 'Michael',   email: 'michael@email.com',   age: 15, country: 'Colombia' },
    { name: 'Nicolás',   email: 'nicolas@email.com',    age: 43, country: 'Colombia' }
  ];

  $scope.OnClickSelect=function(item)
  {
   $scope.multipleDemo.push(item.name);
  }

  $scope.OnRemoveSelect = function(item) { 
   var index = $scope.people.indexOf(item.name);
   $scope.people.splice(index, 1); 
  }

  $scope.clearTag = function() {
    for(var i =0; i < $scope.multipleDemo.length; i++) {
      $scope.multipleDemo.splice($scope.multipleDemo[i], 1000);
      $scope.people.push($scope.multipleDemo[i]);
    }
  }

1 Ответ

0 голосов
/ 15 апреля 2019

Angular-UI-Select Общие проблемы

ng-model не работает с простой переменной на $scope

Вы не можете написать:

WRONG

<ui-select ng-model="multipleDemo"> <!-- Wrong -->
  [...]
</ui-select>

Вам необходимо написать :

<ui-select ng-model="vm.multipleDemo"> <!-- Correct -->
  [...]
</ui-select>

Для получения дополнительной информации см.


Обновление

vm.multipleDemo не работает;Я пытаюсь $parent.multipleDemo - это работает.Я не понимаю $parent.Почему это работает?

Для работы vm.multipleDemo контроллер должен инициализировать объект vm:

app.controller('DemoCtrl', function($scope, $http, $timeout) {
    $scope.vm = { multipleDemo: [] };

Новые разработчики AngularJS часто не осознают, чтоng-repeat, ng-switch, ng-view, ng-include и ng-if - все создают новые дочерние области, поэтому проблема [скрытие данных] часто проявляется, когда эти директивы задействованы.(См. этот пример для быстрой иллюстрации проблемы.)

Эту проблему с примитивами можно легко избежать, следуя "передовому опыту" всегда с '.'в ваших ng-моделях - смотреть стоит 3 минуты.Миско демонстрирует проблему примитивного связывания с ng-switch.

- Каковы нюансы прототипа / прототипического наследования в AngularJS?

Избегайте использования $parent чтобы исправить проблему сокрытия данных.Это хрупкое решение, поскольку между контроллером и директивой ui-select может быть несколько уровней иерархии области видимости.Я считаю использование $parent кодовым запахом , признаком более глубокой проблемы.


Обновление № 2

Когда яможно использовать $ctrl в поле зрения и this в контроллере?

Если для экземпляра контроллера используется синтаксис «контроллер как»:

<body ng-controller="DemoCtrl as $ctrl">

    <ui-select ng-model="$ctrl.multipleDemo">
       <!-- -->
    </ui-select>

Тогда нет необходимости использовать $scope:

app.controller('DemoCtrl', function($http) {
    this.multipleDemo =  [];

И это позволяет избежать проблемы скрытия данных.

Для получения дополнительной информации см.

...