Saya perlu menjalankan fungsi tautan dalam arahan setelah respons http kembali. Idenya kira-kira seperti ini:
<input type="text" my-field>
<script>
angular.module("mine")
.controller ('myCtrl', function ($scope) {
$http.get("/my/service").success(function (data, status, headers, config) {
// OK, done with the query... now I know my field name to bind to. Somehow
// I have to get it down to the link function below...
});
})
.directive ('myField', function ($compile) {
return {
link: function (scope, element, attrs) {
var my_field = attrs.myField;
element.removeAttr('my-field');
// Somehow figure out the field here in ngFieldSpec
element.attr('ng-model', ngFieldSpec);
$compile(element)(scope);
};
});
</script>
Di sini, saya perlu mengikat kolom input ke elemen respons, tetapi saya tidak tahu elemen apa yang akan dipanggil sampai saya mendapatkan respons. Tetapi ketika saya menjalankannya, tautan arahan berjalan sebelum $http selesai: urutan sebenarnya adalah
- $http.mulai
- fungsi tautan arahan dijalankan
- $http.get mengembalikan kesuksesan
Saya agak akrab dengan $q, tapi saya tidak yakin bagaimana hal itu akan digunakan untuk melakukan apa yang perlu dilakukan. BTW, saya hanya menunjukkan satu kolom input yang menjalankan direktif myField, namun kemungkinan ada banyak input di halaman tersebut, dan semuanya memerlukan informasi yang sama.
Diedit untuk menambahkan lebih banyak informasi sebagai respons terhadap permintaan:
Saya memiliki layanan yang mengembalikan struktur data JSON. Saya tidak tahu sebelumnya seperti apa struktur data itu nantinya, tapi saya bisa mengetahuinya dan mencocokkan bidang tersebut dengan bidang masukan halaman saya. Saya mencoba melakukan pencocokan ini di fungsi tautan. Saya senang melakukannya di tempat lain; Saya bisa melakukannya di fungsi $http.success, tetapi itu berarti melakukan manipulasi DOM di pengontrol; dan pemahaman saya adalah bahwa manipulasi DOM hanya boleh dilakukan dalam arahan.
Inilah tampilan HTML saya:
<input type="text" my-field="[MY_EXTENSION_NAME]myFieldName">
<input type="text" my-field="[MY_EXTENSION_NAME]myFieldName2">
<input type="text" my-field="[MY_EXTENSION_NAME_2]myFieldName">
Respon dari server akan seperti ini:
{
realField1: "Diddly",
realField2: "Squat",
extensions: [
{
name: "MY_EXTENSION_NAME",
fields: [
{ name="myFieldName" value="Foo" },
{ name="myFieldName2" value="Bar" }
]
},
{
name: "MY_EXTENSION_NAME_2",
fields: [
{ name="myFieldName" value="Baz" },
{ name="myFieldName2" value="Buz" }
]
}
]
}
Respons server mungkin berbeda-beda karena:
- Mungkin ada sejumlah ekstensi ("MY_EXTENSION_NAME", dll.)
- Ekstensi dapat dikembalikan dalam urutan apa pun
- Mungkin ada sejumlah bidang
- Bidang dapat dikembalikan dalam urutan apa pun
Seluruh masalahnya di sini adalah saya ingin mengonversi "[MY_EXTENSION_NAME]myFieldName" menjadi ng-model "model.extensions[0].fields[0].value. Namun, saya sekarang berpikir untuk mengubah data menjadi bentuk kanonik selama membaca akan lebih mudah, jadi ng-model bisa berupa "model.my_extension_name.myFieldName".
$watch
dapat membantu. - person Beterraba   schedule 11.01.2014$compile
di dalam fungsi tautan? Anda mungkin dapat mencapai apa yang Anda perlukan dengan cakupan terisolasi menggunakan '@'. tolong jelaskan apa yang ingin Anda lakukan. - person Ilan Frumer   schedule 11.01.2014