Próbuję uzyskać oceniany atrybut z mojej niestandardowej dyrektywy, ale nie mogę znaleźć odpowiedniego sposobu na zrobienie tego.
Stworzyłem ten jsFiddle do opracowania.
<div ng-controller="MyCtrl">
<input my-directive value="123">
<input my-directive value="{{1+1}}">
</div>
myApp.directive('myDirective', function () {
return function (scope, element, attr) {
element.val("value = "+attr.value);
}
});
czego mi brakuje?
javascript
binding
angularjs
directive
Shlomi Schwartz
źródło
źródło
Odpowiedzi:
Uwaga: aktualizuję tę odpowiedź, ponieważ znajduję lepsze rozwiązania. Zachowuję również stare odpowiedzi do wykorzystania w przyszłości, o ile będą one powiązane. Najnowsza i najlepsza odpowiedź jest najważniejsza.
Lepsza odpowiedź:
Dyrektywy w angularjs są bardzo potężne, ale potrzeba czasu, aby zrozumieć, które procesy za nimi stoją.
Podczas tworzenia dyrektyw angularjs umożliwia utworzenie izolowanego zakresu z pewnymi powiązaniami z zakresem nadrzędnym. Te powiązania są określone przez atrybut, który dołączasz do elementu w DOM oraz sposób definiowania właściwości scope w obiekcie definicji dyrektywy .
Istnieją 3 rodzaje opcji wiązania, które możesz zdefiniować w zakresie i zapisujesz je jako atrybuty związane z prefiksami.
HTML
W takim przypadku w zakresie dyrektywy (niezależnie od tego, czy chodzi o połączenie funkcji czy kontrolera), możemy uzyskać dostęp do tych właściwości w następujący sposób:
„Nadal OK” Odpowiedź:
Ponieważ ta odpowiedź została zaakceptowana, ale ma pewne problemy, zamierzam ją zaktualizować do lepszej. Najwyraźniej
$parse
jest to usługa, która nie leży we właściwościach bieżącego zakresu, co oznacza, że przyjmuje tylko wyrażenia kątowe i nie może osiągnąć zakresu.{{
,}}
wyrażenia są kompilowane podczas inicjacji angularjs, co oznacza, że kiedy próbujemy uzyskać do nich dostęp w naszejpostlink
metodzie dyrektyw , są one już skompilowane. ({{1+1}}
jest2
już w dyrektywie).Oto jak chcesz użyć:
.
Jedną z rzeczy, które powinieneś tutaj zauważyć, jest to, że jeśli chcesz ustawić ciąg wartości, powinieneś zawinąć go w cudzysłów. (Patrz 3. wejście)
Oto skrzypce do zabawy: http://jsfiddle.net/neuTA/6/
Stara odpowiedź:
Nie usuwam tego dla ludzi, którzy mogą być wprowadzani w błąd, tak jak ja, zauważ, że używanie
$eval
jest w porządku poprawny sposób, ale$parse
ma inne zachowanie, prawdopodobnie nie będziesz tego potrzebował w większości przypadków.Sposobem na to jest ponowne użycie
scope.$eval
. Nie tylko kompiluje wyrażenie kątowe, ale ma również dostęp do właściwości bieżącego zakresu.Brakowało ci tego
$eval
.źródło
$scope.text
będzie niezdefiniowana w funkcji łączenia. Sposób, w jaki obecnie brzmi odpowiedź, brzmi, jakby nie byłby niezdefiniowany. Musisz użyć $ observ () (lub $ watch () też tutaj będzie działał), aby asynchronicznie zobaczyć interpolowaną wartość. Zobacz moją odpowiedź, a także stackoverflow.com/questions/14876112/...$parse
usługa jest wstrzykiwana, a następnie nigdy nie używana. Czy coś brakuje?Dla wartości atrybutu, którą należy interpolować w dyrektywie, która nie korzysta z izolowanego zakresu, np.
użyj metody Atrybuty
$observe
:Z dyrektywy stronie
Jeśli wartość atrybutu jest tylko stałą, np.
możesz użyć $ eval, jeśli wartością jest liczba lub wartość logiczna, i chcesz mieć poprawny typ:
Jeśli wartością atrybutu jest stała ciągu lub jeśli chcesz, aby wartość była typem ciągu w dyrektywie, możesz uzyskać do niej bezpośredni dostęp:
Jednak w twoim przypadku, ponieważ chcesz obsługiwać interpolowane wartości i stałe, użyj
$observe
.źródło
Pozostałe odpowiedzi tutaj są bardzo poprawne i cenne. Ale czasami chcesz po prostu proste: uzyskać zwykłą starą przeanalizowaną wartość przy tworzeniu instancji dyrektywy, bez potrzeby aktualizacji i bez bałaganu z izolowanym zakresem. Na przykład przydatne może być podanie deklaratywnego ładunku w dyrektywie jako tablicy lub obiektu mieszającego w postaci:
W takim przypadku możesz przejść do sedna i po prostu użyć ładnego podstawowego
angular.$eval(attr.attrName)
.Pracujący Fiddle .
źródło
Dla tego samego rozwiązania, którego szukałem
Angularjs directive with ng-Model
.Oto kod, który rozwiązuje problem.
HTML DOM
Mój wynik to:
źródło
Użyj limitu czasu $, ponieważ dyrektywa ładuje po załadowaniu dom, więc zmiany nie mają zastosowania
źródło