【问题标题】:Multi select Elements with Angular 2 / 4使用 Angular 2 / 4 多选元素
【发布时间】:2017-11-27 07:53:11
【问题描述】:

基本上我想知道如何使用 Angular 2/4(抱歉是西班牙语)。

  • 使用 *NgFor 我想选择 1 个或多个项目来启用 HTML 元素,如果没有选择任何元素,我需要禁用它才能显示 默认元素。

  • 我想知道如何做类似于 Plunkerthis 但使用卡片列表的操作(相同的效果按住 Ctrl 或 Shif 并拖动鼠标选择项目并获取数据)。

我有这样的事情

<div class="col s3">
  <button *ngIf="add" mz-button float="true"><i mz-icon [icon]="'add'"></i></button>
  <button *ngIf="!add" mz-button float="true"><i mz-icon [icon]="'remove'"></i></button>
</div>

<mz-card *ngFor="let usuario of usuarios" (click)="onSelecPersona()">
    <mz-card-content>
      <div class="row">
        <div class="col s6">
          {{usuario.nombre}}
        </div>
        <div class="col s6 right-align">
          <i *ngIf="usuario.admin" mz-icon-mdi [icon]="'star'"></i>
          <i *ngIf="!usuario.admin" mz-icon-mdi [icon]="'star-2'"></i>
        </div>
      </div>
    </mz-card-content>
  </mz-card>

我的组件是

add = true;
  usuarios = [
    { nombre: 'Alexis Wursten', admin: false  },
    { nombre: 'Janco Boscan', admin: true  },
    { nombre: 'Noemi Iturralde', admin: false  },
  ];

  onSelecPersona() {
    this.add = false;
  }

谢谢 =)

【问题讨论】:

    标签: javascript css angular select


    【解决方案1】:

    这是完整的示例代码:

    import { Component, OnInit, HostListener } from '@angular/core';
    
    @Component({
        template: `
                <mz-card [class.selected]="usuario.selected" *ngFor="let usuario of usuarios" (click)="onSelecPersona(usuario)" (mouseenter)="onMouseOver($event, usuario)" (mouseleave)="onMouseOver($event, usuario)">
                    <mz-card-content>
                      <div class="row">
                        <div class="col s6">
                          {{usuario.nombre}}
                        </div>
                        <div class="col s6 right-align">
                          <i *ngIf="usuario.admin" mz-icon-mdi [icon]="'star'"></i>
                          <i *ngIf="!usuario.admin" mz-icon-mdi [icon]="'star-2'"></i>
                        </div>
                      </div>
                    </mz-card-content>
                  </mz-card>
              `,
        styles: [`
                mz-card-content {
                  user-select: none;
                }
                .selected {
                  background: red;
                }
              `]
    })
    export class NameComponent {
        private dragStart:number = 0;
        private dragOver:number = 0;
    
        constructor() {}
    
        @HostListener('document:mousedown', ['$event'])
        onMouseDown(ev) {
            this.dragStart = ev.clientY;
        }
        @HostListener('document:mouseup', ['$event'])
        onMouseUp(ev) {
            this.dragStart = 0;
            this.dragOver = 0;
        }
    
        public usuarios:Array<{id?: number; nombre: string; admin: boolean;}> = [
            { nombre: 'Alexis Wursten', admin: false  },
            { nombre: 'Janco Boscan', admin: true  },
            { nombre: 'Noemi Iturralde', admin: false  },
        ];
        public added: string[] = [];
    
        onSelecPersona(item) {
            if(this.added.indexOf(item.nombre)===-1) { // or compare by id
                this.added = this.added.concat([item.nombre]);
            }
            else {
                this.added = this.added.filter((x) => item.nombre!==x); // or compare by id
            }
            this.usuarios = this.usuarios.map((x) => (x===item.nombre ? Object.assign({}, x, { selected: !(this.added.indexOf(item.nombre)!==-1) }) : x));
        }
    
        onMouseOver(ev, item) {
            if(ev.which!==1) {
                return false;
            }
    
            ev.preventDefault();
    
            if(ev.type==='mouseenter' && !item.selected) {
                this.dragOver = ev.clientY - this.dragStart > 0 ? 1:-1;
                this.onSelecPersona(item);
                return false;
            }
    
            if(ev.type==='mouseleave') {
                if(this.dragOver===1 && ev.clientY < ev.target.offsetTop && item.selected) {
                    console.log('desel...', item);
                    this.onSelecPersona(item);
                    return false;
                }
                if(this.dragOver===-1 && ev.clientY > ev.target.offsetTop && item.selected) {
                    console.log('desel...', item);
                    this.onSelecPersona(item);
                    return false;
                }
            }
        }
    
        ngOnInit() {
        }
    }
    

    【讨论】:

    • 谢谢,这帮助我完成了我需要的 70% 或 80%,有了这个我可以完成第一点,现在我需要搜索如何像 Plunker 示例那样做拖动效果。
    • 那比较复杂,我会考虑一下,如果我有什么想法会编辑我的答案;]。
    • 您可以尝试使用多选框来执行此操作,例如 plunker 的示例!?
    • 我已经编辑了我的答案,希望对您正在寻找的类似行为有所帮助。
    • 好的,我只是想让你知道。在我为您提供的示例中,您可以在按住鼠标左键并拖动元素的同时选择元素;]
    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 2016-03-29
    • 2016-12-09
    • 2017-07-16
    • 2017-11-25
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多