2016-03-15 13 views
5

Ich möchte den Fokus auf ein Formularelement setzen. Mit jQuery ist das so einfach, nur $('selector').focus.Ein Element in Aurelia fokussieren

Ich habe eine einfache <input ref="xxx" id="xxx" type="text"> erstellt und in meiner .ts Datei füge ich eine Eigenschaft und verwenden Sie es hier:

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

Nichts passiert. Beginne zu fühlen, dass einige einfache Dinge schwierig werden, was ich sicher nie der Punkt war.

(der ursprüngliche Anwendungsfall war in einem Bootstrap Zusammenbruch Fokus auf ein Formularelement zu setzen, wenn der Zusammenbruch, wie dies dargestellt ist:

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

Das ist für meine grundlegenden HTML funktioniert (nicht einzelne Seite app) , aber nicht mit Aurelia. Was der Aurelia Weg ist?

aktualisieren die Antwort von Miroslav Popovic mit unten, und in den Kommentaren, habe ich es wie so (denken sie daran zu arbeiten, das ist eine Bootstrap Zusammenbruch Komponente):

<!-- 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> 

Antwort

8

this.xxx.focus() funktioniert nicht, weil es keine focus() Methode auf DOM-Element ist. jQuery fügt das hinzu. Die von Aurelia erstellte Referenz verweist auf ein einfaches DOM-Element. Damit es funktioniert, müssen Sie jQuery und wickelt Element importieren:

import $ from 'jquery'; 

// ... 

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

Auf jeden Fall sollten Sie mit jQuery in regelmäßiger Ansicht Modellen vermeiden. Es ist in Ordnung, es für benutzerdefinierte Elemente und benutzerdefinierte Attribute zu verwenden, wo Sie mit DOM interagieren oder einige jQuery-Plugins initialisieren müssen.

Es gibt ein focus benutzerdefinierte Attribut in Aurelia. Sie können mehr darüber in this Aurelia's blog post lesen.

Im Grunde ermöglicht es Ihnen, den Fokus von Ihrem Ansichtsmodell zu steuern. Ihrer Ansicht nach hätte man dies:

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

Und im Hinblick Modell:

attached() { 
    this.hasFocus = true; 
} 

Natürlich werden Sie wahrscheinlich für eine komplexere Szenarien, dass. I.e. um eine Eingabe zu fokussieren, wenn collapse erweitert wird, oder wenn ein neues Element zu einem Array hinzugefügt wird, das an repeat.for gebunden ist.

Außerdem focus Attribut implementiert Zwei-Wege-Bindung. In obigem Beispiel wird der Wert der hasFocus Eigenschaft entsprechend geändert.

+0

Und wie würden Sie hören das Kollapsevent? Importieren Sie $ und verwenden Sie '$ ('# collapsedAddTask'). On ('show.bs.collapse', function() {....})' oder gibt es einen Aurelia-Weg? – specimen

+1

Die Verwendung von jQuery ist eine Option.Ich glaube nicht, dass Sie einen Trigger an dieses Ereignis in Sicht binden können ('

), da es kein reguläres DOM-Ereignis ist ... Normalerweise wollen Sie alle DOM-bezogene Logik entweder mit jQuery oder mit einfachem DOM kapseln , zu benutzerdefinierten Elementen oder benutzerdefinierten Attributen. I.e. in diesem Fall können Sie benutzerdefinierte Element und haben so etwas wie '' verwenden. http://aurelia.io/docs#/aurelia/framework/1.0.0-beta.1.4/doc/article/cheat-sheet/9 –

+1

Eine andere Idee ... Sie könnten das benutzerdefinierte Attribut "focus-child" erstellen Das würde dieses 'show.bs.collapse'-Ereignis behandeln und einen Fokus auf das erste Eingabeelement oder Element mit dem angegebenen ID-Wert setzen. Damit könntest du dieses Attribut einfach zu div hinzufügen - '

'. Mehr über benutzerdefinierte Attribute in Dokumenten - http://aurelia.io/docs#/aurelia/framework/1.0.0-beta.1.4/doc/article/cheat-sheet/8 –

2

Für die Situation, in der das Element nicht verborgen ist, und Sie würden es Fokus haben möchten, sobald die Ansicht fertig geladen ist, können Sie einfach focus.one-time="true" wie so hinzufügen:

für
<input 
    type="text" 
    class="form-control" 
    focus.one-time="true" 
    value.bind="email" 
    placeholder="email address">