2016-03-03 68 views
3

我想創建一個通用的下拉控件在角2,使用語義的用戶界面。我有以下代碼:Angular 2語義UI下拉JS不工作

import {ElementRef, Component, OnInit, EventEmitter} from "angular2/core"; 
import {DropdownValue} from "./dropdown-value"; 

declare var jQuery: any; 

@Component({ 
selector: 'my-dropdown', 
inputs: ['selectedItem', 'items', 'label'], 
outputs: ['selectedItemChange'], 
template: ` 
<div class="field">   
    <label>{{label}}</label>   
    <select class="ui selection dropdown" [ngModel]="selectedItem.value" (ngModelChange)="onChange($event)"> 
     <!--<option value="" selected>Please Select</option>--> 
     <option *ngFor="#item of items" [value]="item.value">{{item.label}}</option> 
    </select>   
</div>` 
}) 

export class MyDropdownComponent implements OnInit { 

items: DropdownValue[]; 
selectedItem: DropdownValue; 
selectedItemChange: EventEmitter<any> = new EventEmitter(); 

constructor(private elementRef: ElementRef) { 
} 

ngOnInit(): any { 
    this.items.unshift(new DropdownValue('', 'Please Select')); 
    this.selectedItem = this.selectedItem || this.items[0]; 
    //jQuery(this.elementRef.nativeElement).find('select').dropdown(); 
} 

onChange(newValue) { 
    let selectedItem = this.items.find(item => item.value == newValue); 
    this.selectedItemChange.emit(selectedItem); 
} 

} 

其實,這只是正常,因爲它是(無語義UI JS造型),問題是,當我取消對該行//jQuery(this.elementRef.nativeElement).find('select').dropdown();「請選擇」不再可見並沒有顯示最初的選擇。

回答

4

工作作爲岡特說,你應該在ngAfterViewInit調用jQuery().dropdown()()。

dropdown()重置所選值。所以你必須dropdown()後重新選擇所需的值:

ngAfterViewInit(){ 
    jQuery(this.elementRef.nativeElement).find('select').dropdown({allowTab:false}); 
    jQuery(this.elementRef.nativeElement).find('select').dropdown("set selected",this.selectedItem.value); 
} 

plunkr

3

使用

setTimeout(() => 
    jQuery(this.elementRef.nativeElement).find('select').dropdown(); 
}, 1); 

給角一些空氣呼吸 - 更新視圖來顯示this.items.unshift

或使用ngAfterViewInit()。這樣,它應該不setTimeout()

ngAfterViewInit() { 
    jQuery(this.elementRef.nativeElement).find('select').dropdown(); 
} 
+0

請詳細說明:更新視圖來顯示'this.items.unshift'? – EnlitenedZA

+0

當您從數組中添加/移除項目(或者以其他方式更改來自'* ngFor =「#項目項目的視圖的邊界值)時,視圖僅在下一個更改檢測週期後更新。更改檢測無法在同步執行的代碼行之間運行。因此,我們重新調度'jQuery'調用,以允許Angular進行更改檢測並更新HTML,然後只有'jQuery()'才能在那裏找到元素。 –

+0

如果我按照你的建議讓JQuery超時,它就會失去它的初始選擇。我在ngOnInit上設置了初始選擇,如下所示:'this.selectedItems = this.items [1];' – EnlitenedZA