Po wyszukaniu przykładów tego, jak elementy ustawiania ostrości za pomocą kątów, zauważyłem, że większość z nich używa jakiejś zmiennej do obserwowania, a następnie ustawia ostrość, a większość z nich używa jednej zmiennej dla każdego pola, na które chce ustawić ostrość. W formie z wieloma polami oznacza to wiele różnych zmiennych.
Mając na uwadze jquery, ale chcąc to zrobić w sposób kątowy, stworzyłem rozwiązanie, w którym ustawiamy fokus w dowolnej funkcji za pomocą id elementu, więc ponieważ jestem bardzo nowy w angularach, chciałbym uzyskać opinie, jeśli ten sposób jest słuszny, mam problemy, cokolwiek, cokolwiek, co mogłoby mi pomóc w lepszym rozwiązaniu w kątowym.
Zasadniczo tworzę dyrektywę, która obserwuje wartość zakresu zdefiniowaną przez użytkownika za pomocą dyrektywy lub domyślny focusElement, a gdy ta wartość jest taka sama jak id elementu, ten element ustawia ostrość.
angular.module('appnamehere')
.directive('myFocus', function () {
return {
restrict: 'A',
link: function postLink(scope, element, attrs) {
if (attrs.myFocus == "") {
attrs.myFocus = "focusElement";
}
scope.$watch(attrs.myFocus, function(value) {
if(value == attrs.id) {
element[0].focus();
}
});
element.on("blur", function() {
scope[attrs.myFocus] = "";
scope.$apply();
})
}
};
});
Wkład, na którym z jakiegoś powodu musi się skupić, zrobi to w ten sposób
<input my-focus id="input1" type="text" />
Tutaj dowolny element do ustawienia ostrości:
<a href="" ng-click="clickButton()" >Set focus</a>
I przykładowa funkcja ustawiająca fokus:
$scope.clickButton = function() {
$scope.focusElement = "input1";
}
Czy to dobre rozwiązanie w kątowym? Czy ma problemy, których z moim słabym doświadczeniem jeszcze nie widzę?
Jeśli chodzi o to rozwiązanie, moglibyśmy po prostu stworzyć dyrektywę i dołączyć ją do elementu DOM, który ma być aktywny po spełnieniu danego warunku. Postępując zgodnie z tym podejściem, unikamy łączenia kontrolera z identyfikatorami elementów DOM.
Przykładowa dyrektywa w kodzie:
Możliwe użycie
});
HTML
źródło
myCondition
zmienna $ scope została już ustawiona na true, a następnie użytkownik wybierze skupienie się na innym elemencie, czy nadal możesz ponownie aktywować fokus, gdymyCondition
jest już prawdziwy, twój kod obserwuje zmiany atrybutu,focusOnCondition
ale nie zostanie wyzwolony, gdy wartość, którą próbujesz zmienić, jest nadal taka sama.Lubię unikać wyszukiwań DOM, zegarków i globalnych emiterów, gdy tylko jest to możliwe, więc używam bardziej bezpośredniego podejścia. Użyj dyrektywy, aby przypisać prostą funkcję, która koncentruje się na elemencie dyrektywy. Następnie wywołaj tę funkcję w dowolnym miejscu w zakresie kontrolera.
Oto uproszczone podejście do dołączania go do zakresu. Zobacz pełny fragment opisujący składnię kontrolera jako.
Dyrektywa:
oraz w html:
lub w kontrolerze:
Pokaż fragment kodu
Edytowano, aby zapewnić więcej wyjaśnień na temat powodu tego podejścia i rozszerzyć fragment kodu dla kontrolera jako użycia.
źródło
ng-repeat
i chcę ustawić funkcję fokusu tylko dla pierwszego. Masz pomysł, jak mógłbym warunkowo ustawić funkcję fokusu na<input>
podstawie na$index
przykład?assign-focus-function-if="{{$index===0}}"
, a następnie jako pierwsza linia dyrektywy wyjdź wcześnie przed przypisaniem funkcji, jeśli to nie jest prawda:if (attr.assignFocusFunctionIf===false) return;
Uwaga, sprawdzam, czy jest wyraźnie,false
a nie tylko falsey, więc dyrektywa będzie nadal działać, jeśli ten atrybut nie zostanie zdefiniowany._.set(scope, attributes.focusOnSaveInput, function() { element.focus(); })
.Możesz spróbować
np.
to działa dla mnie.
źródło
Inną opcją byłoby użycie wbudowanej architektury pub-sub Angulara w celu powiadomienia dyrektywy o skupieniu. Podobne do innych podejść, ale nie jest wtedy bezpośrednio powiązane z właściwością, a zamiast tego nasłuchuje w swoim zakresie określonego klucza.
Dyrektywa:
HTML:
Kontroler:
źródło
Wolałem użyć wyrażenia. To pozwala mi robić takie rzeczy, jak skupienie się na przycisku, gdy pole jest prawidłowe, osiąga określoną długość i oczywiście po załadowaniu.
W złożonej formie ogranicza to również potrzebę tworzenia dodatkowych zmiennych zakresu w celu skupienia uwagi.
Zobacz https://stackoverflow.com/a/29963695/937997
źródło