2016-06-21 4 views
27

В приведенном ниже коде removeSelectedCountry() следует вызывать, когда элемент span нажимается, а handleKeyDown($event) следует вызывать, когда на div находится событие keydown.В угловом2 вводит ключевой триггер любое событие click на странице?

@Component({ 
    selector: "wng-country-picker", 
    template: ` 
    <ul class="CountryPicker-selected" *ngIf="selectedCountries.length > 0"> 
    <li *ngFor="let country of selectedCountries"> 
     <span class="Pill Pill--primary" (click)="removeSelectedCountry(country)"> 
     {{ country.name }} 
     </span> 
    </li> 
    </ul> 
    <div (keydown)="handleKeyDown($event)" class="CountryPicker-input"></div> 
`, 
providers: [CUSTOM_VALUE_ACCESSOR] 
}) 

Но removeSelectedCountry() вызывается каждый раз, когда вводится клавиша ввода.

Чтобы сделать код работы, мне пришлось изменить событие click на событие mousedown. Теперь он отлично работает.

Может ли кто-нибудь объяснить, зачем вводить ключ, вызывает событие click?

@Component({ 
    selector: "wng-country-picker", 
    template: ` 
    <ul class="CountryPicker-selected" *ngIf="selectedCountries.length > 0"> 
    <li *ngFor="let country of selectedCountries"> 
     <span class="Pill Pill--primary" (mousedown)="removeSelectedCountry(country)"> 
     {{ country.name }} 
     </span> 
    </li> 
    </ul> 
    <div (keydown)="handleKeyDown($event)" class="CountryPicker-input"></div> 
`, 
providers: [CUSTOM_VALUE_ACCESSOR] 
}) 

Добавление класса snipppet

export class CountryPickerComponent { 

private selectedCountries: CountrySummary[] = new Array(); 

private removeSelectedCountry(country: CountrySummary){ 
    // check if the country exists and remove from selectedCountries 
    if (this.selectedCountries.filter(ctry => ctry.code === country.code).length > 0) 
    { 
     var index = this.selectedCountries.indexOf(country); 
     this.selectedCountries.splice(index, 1); 
     this.selectedCountryCodes.splice(index, 1); 
    } 
} 

private handleKeyDown(event: any) 
{ 
    if (event.keyCode == 13) 
    { 
     // action 
    } 
    else if (event.keyCode == 40) 
    { 
     // action 
    } 
    else if (event.keyCode == 38) 
    { 
     // action 
    }  
} 
+0

Можете ли вы показать свой класс? – NEER

+0

Я столкнулся с той же проблемой: «Кто-нибудь может объяснить, почему ключ ввода будет вызывать событие click?» – Deshak9

+0

У меня такая же проблема, используя фильтрацию ** Keyup ** на ** Enter **. В моем сценарии, похоже, только инициирует событие click в той же реактивной форме. –

ответ

74

Для клавиши ENTER, почему бы не использовать (keyup.enter):

@Component({ 
    selector: 'key-up3', 
    template: ` 
    <input #box (keyup.enter)="values=box.value"> 
    <p>{{values}}</p> 
    ` 
}) 
export class KeyUpComponent_v3 { 
    values = ''; 
} 
+1

Мне нужно выполнить действие на основе нажатой клавиши, поэтому '(keyup.enter)' не помогло бы –

+0

Вы могли бы добавить все 3 события, такие как keyup.xxx – AngJobs

+0

Можете ли вы поделиться ссылкой, чтобы узнать подробности этих событий в Angular – Subroto

21

Использование (keyup.enter).

Угловой может фильтровать ключевые события для нас. Угловой имеет специальный синтаксис для событий клавиатуры. Мы можем прослушать только клавишу Enter, привязав к псевдо-событию Angular's keyup.enter.

+1

** ЭТО НЕ РАБОТАЕТ! ** Он имеет тот же побочный эффект. Я фильтруюсь на keyup.enter, но мое приложение также запускает событие щелчка кнопки фокуса. –

2
<form (keydown)="someMethod($event)"> 
    <input type="text"> 
</form> 
someMethod(event:any){ 
    if(event.keyCode == 13){ 
     alert('Entered Click Event!'); 
    }else{ 
    } 
} 
+0

'keyCode' устарел. Вместо этого используйте' key' – Johannes

4

Вот правильная РЕШЕНИЕ! Поскольку кнопка не имеет определенного типа атрибута, возможно, попытка углового, возможно, выполнить событие keyup в качестве запроса на отправку и инициирует событие клика на кнопке.

<button type="button" ...></button> 

Большое спасибо DeborahK!

Angular2 - Enter Key executes first (click) function present on the form

1
@Component({ 
    selector: 'key-up3', 
    template: ` 
    <input #box (keyup.enter)="doSomething($event)"> 
    <p>{{values}}</p> 
    ` 
}) 
export class KeyUpComponent_v3 { 
    doSomething(e) { 
    alert(e); 
    } 
} 

Это работает для меня!

Смежные вопросы