2016-03-15 23 views
5

Chcę ustawić fokus na elemencie formularza. Z jQuery jest to takie proste, tylko $('selector').focus.Skupienie elementu w Aurelia

Stworzyłem prostą <input ref="xxx" id="xxx" type="text"> i złożyć moje .ts I dodać obiekt i użyć go tutaj:

attached() { 
    this.xxx.focus() 
} 

Nic się nie dzieje. Zaczyna się czuć, że niektóre proste rzeczy stają się trudne, co na pewno nigdy nie miało sensu.

(przypadek oryginalne wykorzystanie było ustawić ostrość do elementu formularza wewnątrz upadku Bootstrap, gdy upadek jest pokazane, jak to:

// set focus to the first element when the add-cell collapse is shown 
$('#collapsedAddTask').on('shown.bs.collapse', function() { 
    $('#AddTaskTitle').focus() 
}) 

który działa dla mojego podstawowego HTML (nie pojedynczy app strona) , ale nie z Aurelia. Jaki jest sposób Aurelia?

Aktualizacja Używanie odpowiedź od Miroslav Popovic poniżej, w komentarzach, mam go do pracy jak tak (należy pamiętać, że jest to składnik upadek Bootstrap):

<!-- the heading with an A that toggles visibility --> 
<div class="panel-heading"> 
    <a href="#collapsedAddTask" data-toggle="collapse" id="addTaskHeader" click.delegate="addTaskShown()">Add task</a> 
</div> 
<!-- the body, which is initially hidden --> 
<div class="panel-body"> 
    <div class="collapse" id="collapsedAddCell"> 
     <input type="text" focus.bind="addTaskFocused"> 
     <!-- more controls ... --> 
    </div> 
</div> 

Odpowiedz

8

this.xxx.focus() nie działa, ponieważ nie ma focus() metoda na elemencie DOM. jQuery dodaje to. Referencja stworzona przez Aurelia wskazuje na prosty element DOM. Aby to działało, trzeba by importować jQuery i owinąć elementu:

import $ from 'jquery'; 

// ... 

attached() { 
    $(this.xxx).focus(); 
} 

W każdym razie należy unikać przy użyciu jQuery w regularnych modeli widzenia. Można go używać do niestandardowych elementów i atrybutów niestandardowych, w których trzeba wchodzić w interakcje z DOM lub inicjować niektóre wtyczki jQuery.

Istnieje niestandardowy atrybut focus w Aurelia. Możesz przeczytać więcej na ten temat w this Aurelia's blog post.

Zasadniczo pozwala kontrolować ostrość z modelu widoku. Pana zdaniem, to masz to:

<input type="text" focus.bind="hasFocus" value.bind="..."/> 

iw świetle modelu

attached() { 
    this.hasFocus = true; 
} 

oczywiście, prawdopodobnie będziesz używać, dla bardziej złożonych scenariuszy. To znaczy. skupić dane wejściowe po rozwinięciu collapse lub po dodaniu nowego elementu do tablicy powiązanej z repeat.for.

Ponadto atrybut focus implementuje wiązanie dwukierunkowe. W powyższym przykładzie zmieni on odpowiednio wartość właściwości hasFocus.

+0

A jak byś nasłuchiwać zdarzenie collapse? Zaimportuj $ i użyj '$ ('# collapsedAddTask'). On ('shown.bs.collapse', function() {....})' lub czy istnieje sposób Aurelia? – specimen

+1

Korzystanie z jQuery jest jedną z opcji.Nie sądzę, że można powiązać wyzwalacz z tym zdarzeniem w widoku ('

), ponieważ nie jest to zwykłe zdarzenie DOM ... Zazwyczaj będziesz chciał enkapsulować całą logikę związaną z DOM, używając jQuery lub zwykłego DOM , do niestandardowych elementów lub niestandardowych atrybutów. To znaczy. w tym przypadku możesz użyć elementu niestandardowego i mieć coś w rodzaju ''. http://aurelia.io/docs#/aurelia/framework/1.0.0-beta.1.1.4/doc/article/cheat-sheet/9 –

+1

Kolejny pomysł ... Można utworzyć niestandardowy atrybut 'focus-child' który obsłużyłby zdarzenie 'shown.bs.collapse' i ustawił fokus na pierwszy element wejściowy lub element o podanej wartości identyfikatora. Dzięki temu możesz po prostu dodać ten atrybut, aby zwinąć div - '

'. Więcej o atrybutach niestandardowych w dokumentach - http://aurelia.io/docs#/aurelia/framework/1.0.0-beta.1.1.4/doc/article/cheat-sheet/8 –

2

Dla sytuacji, gdy element nie jest ukryty i chcesz go mieć ostrość raz widok zakończeniu ładowania, można po prostu dodać focus.one-time="true" tak:

<input 
    type="text" 
    class="form-control" 
    focus.one-time="true" 
    value.bind="email" 
    placeholder="email address"> 
Powiązane problemy