2017-06-14 49 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> 
相關問題