Saya mencoba mendapatkan atribut yang dievaluasi dari arahan khusus saya, tetapi saya tidak dapat menemukan cara yang tepat untuk melakukannya.
Saya telah membuat jsFiddle ini untuk diuraikan.
<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);
}
});
Apa yang saya lewatkan?
javascript
binding
angularjs
directive
Shlomi Schwartz
sumber
sumber
Jawaban:
Perhatikan: Saya memperbarui jawaban ini karena saya menemukan solusi yang lebih baik. Saya juga menyimpan jawaban lama untuk referensi di masa mendatang asalkan tetap terkait. Jawaban terbaru dan terbaik didahulukan.
Jawaban yang lebih baik:
Arahan dalam angular sangat kuat, tetapi perlu waktu untuk memahami proses yang ada di belakangnya.
Saat membuat arahan, angularjs memungkinkan Anda untuk membuat ruang lingkup yang terisolasi dengan beberapa ikatan pada ruang lingkup induk. Binding ini ditentukan oleh atribut yang Anda lampirkan elemen di DOM dan bagaimana Anda mendefinisikan properti lingkup dalam objek definisi direktif .
Ada 3 jenis opsi pengikatan yang dapat Anda tetapkan dalam ruang lingkup dan Anda menuliskannya sebagai atribut terkait awalan.
HTML
Dalam hal ini, dalam lingkup arahan (apakah itu dalam fungsi penghubung atau pengontrol), kita dapat mengakses properti ini seperti ini:
"Masih OK" Jawab:
Karena jawaban ini diterima, tetapi memiliki beberapa masalah, saya akan memperbaruinya ke yang lebih baik. Rupanya,
$parse
adalah layanan yang tidak terletak pada properti lingkup saat ini, yang berarti hanya mengambil ekspresi sudut dan tidak dapat mencapai ruang lingkup.{{
,}}
ekspresi dikompilasi ketika angular memulai, yang berarti ketika kita mencoba mengaksesnya dalampostlink
metode arahan kita , mereka sudah dikompilasi. ({{1+1}}
sudah2
dalam arahan).Inilah yang ingin Anda gunakan:
.
Satu hal yang harus Anda perhatikan di sini adalah, jika Anda ingin mengatur nilai string, Anda harus membungkusnya dengan tanda kutip. (Lihat input ke-3)
Inilah biola yang bisa dimainkan: http://jsfiddle.net/neuTA/6/
Jawaban lama:
Saya tidak menghapus ini untuk orang-orang yang dapat disesatkan seperti saya, perhatikan bahwa menggunakan
$eval
sangat baik cara yang benar untuk melakukannya, tetapi$parse
memiliki perilaku yang berbeda, Anda mungkin tidak akan memerlukan ini untuk digunakan dalam sebagian besar kasus.Cara untuk melakukannya adalah, sekali lagi, menggunakan
scope.$eval
. Tidak hanya mengkompilasi ekspresi sudut, ia juga memiliki akses ke properti lingkup saat ini.Apa yang Anda lewatkan adalah
$eval
.sumber
$scope.text
akan ditentukan dalam fungsi penautan. Cara jawabannya saat ini worded, sepertinya itu tidak akan terdefinisi. Anda harus menggunakan $ mengamati () (atau $ menonton () akan benar-benar bekerja di sini juga) untuk secara asinkron melihat nilai yang diinterpolasi. Lihat jawaban saya dan juga stackoverflow.com/questions/14876112/…$parse
layanan disuntikkan dan kemudian tidak pernah digunakan. Apakah saya melewatkan sesuatu?Untuk nilai atribut yang perlu diinterpolasi dalam arahan yang tidak menggunakan lingkup terisolasi, misalnya,
gunakan metode Atribut
$observe
:Dari halaman arahan ,
Jika nilai atribut hanya konstanta, misalnya,
Anda dapat menggunakan $ eval jika nilainya adalah angka atau boolean, dan Anda menginginkan jenis yang benar:
Jika nilai atribut adalah konstanta string, atau Anda ingin nilai tersebut menjadi tipe string dalam arahan Anda, Anda dapat mengaksesnya secara langsung:
Namun, dalam kasus Anda, karena Anda ingin mendukung nilai dan konstanta yang diinterpolasi, gunakan
$observe
.sumber
Jawaban lain di sini sangat benar, dan berharga. Tetapi kadang-kadang Anda hanya ingin sederhana: untuk mendapatkan nilai parsing lama sederhana di instantiation direktif, tanpa perlu pembaruan, dan tanpa mengacaukan ruang lingkup yang terisolasi. Misalnya, dapat berguna untuk menyediakan muatan deklaratif ke dalam direktif Anda sebagai array atau objek-hash dalam bentuk:
Dalam hal ini, Anda dapat memotong ke pengejaran dan hanya menggunakan dasar yang bagus
angular.$eval(attr.attrName)
.Biola yang Bekerja .
sumber
Untuk solusi yang sama yang saya cari
Angularjs directive with ng-Model
.Berikut adalah kode yang menyelesaikan masalah.
HTML DOM
Hasil saya adalah:
sumber
Gunakan $ timeout karena arahan panggilan setelah dom memuat sehingga perubahan Anda tidak berlaku
sumber