Как я могу использовать Selectize.js с Angular2?

Я пытаюсь реализовать Selectize.js с Angular2, но я не могу заставить его работать. Вот что я попробовал в компоненте HTML:

  <div class="form-group">
    <label for="friends">Friends</label>
    <input type="text" class="form-control" #friends
            [(ngModel)]="user.friends" name="friends"
            #picture="ngModel">
  </div>

И в компоненте:

declare let $: any;

@Component({
  selector: 'app-profile',
  templateUrl: './profile.component.html',
  providers: [ AuthenticationService, UserService, MessageService ]
})
export class ProfileComponent implements OnInit, AfterViewInit  {
  @ViewChild('friends') el:ElementRef;

  constructor(
    private _userService: UserService,
    private _authService: AuthenticationService,
  ) { }

  ngAfterViewInit() {

    $('#friends').selectize({
      delimiter: ',',
      persist: false,
      create: function(input) {
        return {
          value: input,
          text: input
        }
      }
    });
  }

  ngOnInit() {

    //...
  }

  onSubmit(event) {
    //...
  }

}

Поэтому я пытаюсь реализовать Selectize в комментариях друзей. Я хочу, чтобы пользователь мог написать имена своих друзей, а затем восстановить их в Angular с помощью массива имен.

Но ничего не происходит в интерфейсе, Selectize ничего не делает. Как так?

2 ответа

Надеюсь, чтобы сделать это немного проще, я создал компонент ng2-selectize, доступный на github & npm.

Его использование может быть:

export class MultiSelectExampleComponent {
  options = [{
  label: 'Angular 2',
  value: 'angular2'
 }, {
  label: 'ReactJS',
  value: 'reactjs'
 }
  ];
  config = {
    labelField: 'label',
    valueField: 'value',
    highlight: false,
    create:false,
    persist:true,
    plugins: ['dropdown_direction', 'remove_button'],
    dropdownDirection: 'down',
    maxItems: 5
  };
  placeholder: string = 'Placeholder...';
  value:string[];

  onValueChange($event) {
    console.log("Option changed: ", $event);
  }
}
  
<div class="example">
    <ng2-selectize [config]="config" [options]="options" [placeholder]="placeholder" [(ngModel)]="value" (ngModelChange)="onValueChange($event)"></ng2-selectize>
</div>

Я использую этот https://www.npmjs.com/package/ng-selectize

И он отлично работает в моем проекте angular 5

Двухсторонняя привязка данных к selectize не работает в angular2, поэтому избавьтесь от этих ngModels. Вместо этого я выполняю функции onItemAdd и onItemRemove в selectize, вот так:

activateSelectize() {
    var $selecitize= jQuery('.selectize');

    this.select= $selectize.selectize({
        delimiter: ',',
        create: (input) => {
            return {
                value: input,
                text: input
            };
        },
        onItemAdd: (value) => {
            this.updateValue({selected: value});
        },
        onItemRemove: (value) => {
            this.updateValue({deselected: value});
        },
    });
 }

И это HTML:

<select class="selectize">
        <option *ngFor="let option of options" value="{{option[0]}}">{{option[1]}}</option>
</select>

Чтобы заставить selectize.js работать с (проверено Angular 8) без плагинов ng2-selectize (дополнительный вес), вы можете сделать следующее:

Установите плагин через NPM:

npm i selectize

Затем установите типы, чтобы получить доступ к intellisense, а также удалите все необъявленные методы, которые машинописный текст не понимает и которые связаны с selectize.

npm i @types/selectize

Теперь в вашем компоненте вам нужно импортировать плагин, сделайте это следующим образом: (убедитесь, что ваш путь к node_modules правильный в вашем приложении из вашего компонента)

import 'node_modules/selectize/dist/js/standalone/selectize.js';

Вам понадобится jQuery, если вы еще не импортировали / не установили его. Теперь в вашем компоненте используйте метод AfterViewInit() - при загрузке при первой инициализации страницы, чтобы вы знали, что DOM создана. Вот так:

    ngAfterViewInit() {
      $(<selector>).selectize({<options-object>});
}

Затем, аналогично тому, что предлагает Роб, используйте один из следующих методов, которые предлагает Selectize: документация здесь

onChange: (value) => {}, onItemAdd: (value, $item) => {}

Это должно помочь вам начать работу с плагином, вам нужно будет импортировать темы CSS или использовать свой собственный стиль.

Другие вопросы по тегам