2017-06-14 48 views
0

我是新来的Angular :)我试图设置复选框的初始状态。 我有一个帖子和类别,其中一些已经分配到该帖子。当我导航到帖子编辑页面时,有一个所有类别的列表,我可以选择/取消选择。我试图实现的是,在init中检查某些复选框(已分配给帖子的类别)。 这是我有:角度2 - 复选框列表的初始状态

//document-edit.component.html 
<div *ngFor="let category of categories"> 
    <div class="checkbox"> 
     <label> 
      <input type="checkbox" 
        [checked]="checkIfCategoryAssigned(category.documents, document.id)" 
        (change)="onChange(category.id, category.name, $event.target.checked)"> {{category.name}} 
     </label> 
    </div> 
</div> 

// document-edit.component.ts 
checkIfCategoryAssigned(categoryDocuments, documentId) { 
    for (let document of categoryDocuments) { 
     if (document.id === documentId) { 
      console.log('true'); 
      return true; 
     } 
    } 
} 

这似乎是工作,但问题是,函数被调用每鼠标移动!我读过我应该使用Observable,但我不知道如何。 Angular文档不包含这种特殊情况。

+1

“函数被调用每鼠标移动”?你可以制造摔跤手吗? – CharanRoot

+0

是的,我正在研究它。 – Tompo

+0

我可能需要时间(应用程序非常复杂),同时有我读过的线索:https://stackoverflow.com/questions/38583967/angular2-why-functions-are-called-each-time-i-移动鼠标 – Tompo

回答

0

如果你想要做检查默认情况下,只要在页面加载后,你可以创建一个变量,并设置默认为真在你的组件,然后像下面应该工作:

组件:

public isUser: boolean = true; 
public isAdmin: boolean =false; 

在您的htlml:

<div class="form-group row"> 
    <label class="col-md-3 form-control-label" for="roles">Roles</label> 
    <div class="col-md-4" > 
    <label class="col-md-3 form-control-label" for="isUser"> 
    <input type="checkbox" class="form-control" name="isUser" [(ngModel)]="isUser" #isuser="ngModel">Can Login</label> 
    </div> 
    <div class="col-md-4"> 
    <label class="col-md-3 form-control-label" for="isAdmin"> 
    <input type="checkbox" class="form-control" name="isAdmin" [(ngModel)]="isAdmin" #isadmin="ngModel">Is Admin</label> 
    </div> 
</div> 

如果要加载基于保存的值,你可以使用快照数据,并完成类似在组件如下:

ngOnInit(): void { 
     this.user = this.route.snapshot.data['user']; 
     this.isUser = this.user.roles.includes('user'); 
     this.isAdmin = this.user.roles.includes('admin'); 
} 

(我使用的是相同的HTML文件这两个例子)

+0

谢谢,但这并没有帮助。我知道如何设置初始状态。但在这种情况下,我有一个类的数组,其中一些需要在init上检查,而不是。这取决于是否将类别分配给某个帖子。 Post对象包含它的类别,category对象包含posts - 它是从后端选择的多对多关系。所以首先我需要循环的类别,并检查如果这个文件ID ===类别文档ID。如果是 - 应该在init上检查复选框。 – Tompo

0

好的,我结束了这一点。似乎是一个更好的方法:

import {Component, OnInit} from '@angular/core'; 
import {ActivatedRoute, Params} from '@angular/router'; 
import {Location} from '@angular/common'; 
import 'rxjs/add/operator/switchMap'; 
import {Observable} from 'rxjs/Rx'; 
import {DocumentService} from './document.service'; 
import {AlertService} from '../alert/alert.service'; 

@Component({ 
    selector: 'document-edit', 
    templateUrl: './document-edit.component.html', 
}) 

export class DocumentEditComponent implements OnInit { 

    public document: any; 
    public categories: any; 
    public categoriesArray: Array<{id: number, name: string}> = []; 

    constructor(
     private documentService: DocumentService, 
     private alertService: AlertService, 
     private route: ActivatedRoute, 
     private location: Location 
    ) {} 

    ngOnInit(): void { 
     this.route.params 
      .switchMap((params: Params) => this.documentService.getDocument(+params['id'])) 
      .subscribe(document => this.document = document); 
     this.getCategories(); 
    } 


    /* 
    * Push categories already assigned to this document 
    * to an array used in updateDocument method 
    * and check already assigned categories in the template. 
    */ 
    documentCategories(document: any, categories: any) { 
     for (let documentCategory of document.categories) { 
      this.categoriesArray.push({id: documentCategory.id, name: documentCategory.name}); 
     }   
     for (let category of categories) { 
      for (let categoryDocument of category.documents) { 
       if (categoryDocument.id === document.id) { 
        category.checked = true; 
       }     
      } 
     } 
    } 

    onChange(id: number, name: string, isChecked: boolean) { 
     if (isChecked) { 
      if (this.categoriesArray.some(x => x.name === name)) { 
       return; 
      } else { 
       this.categoriesArray.push({id: id, name: name}); 
      } 
     } else { 
      let index: number = this.categoriesArray.indexOf(this.categoriesArray.find(x => x.name === name)); 
      this.categoriesArray.splice(index, 1); 
     } 
     return this.categoriesArray; 
    } 

    updateDocument(id: number, title: string, body: any) { 
     let document = {id: id, title: title, body: body, categories: this.categoriesArray}; 
     this.documentService.updateDocument(document).subscribe(
      data => { 
       this.alertService.success('Document updated.'); 
       return true; 
      }, 
      error => { 
       this.alertService.error("Error updating document! " + error); 
       return Observable.throw(error); 
      } 
     ); 
    } 

    getCategories() { 
     this.documentService.getCategories().subscribe(
      data => {this.categories = data}, 
      err => console.error(err), 
      () => this.documentCategories(this.document, this.categories) 
     ); 
    } 

    goBack(): void { 
     this.location.back(); 
    } 

} 

模板:

<form> 
    <div class="row"> 
     <div class="col-md-8"> 
      <div class="form-group"> 
       <label for="document-title">Title</label> 
       <input type="text" 
         class="form-control" 
         id="document-title" 
         name="document-title" [(ngModel)]="document.title"> 
      </div> 
      <div class="form-group"> 
       <label for="document-body">Body</label> 
       <simple-tiny 
        name="document-body" 
        elementId="document-body" 
        [(ngModel)]="document.body"> 
       </simple-tiny> 
      </div> 
     </div> 
     <div class="col-md-4"> 
      <label>Categories</label>       
      <div *ngFor="let category of categories"> 
       <div class="checkbox"> 
        <label> 
         <input type="checkbox" 
           [checked]=category.checked 
           (change)="onChange(category.id, category.name, $event.target.checked)"> {{category.name}} 
        </label> 
       </div> 
      </div> 
     </div>       
    </div> 
    <div class="row"> 
     <div class="col-md-12"> 
      <button type="submit" 
        class="btn btn-default" 
        (click)="updateDocument(document.id, document.title, document.body)"> 
        Submit 
      </button> 
     </div> 
    </div> 
</form> 
相关问题