Мне нужно выполнить функцию ссылки в директиве после возврата ответа http. Идея примерно такая:
<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>
Здесь мне нужно привязать поле ввода к элементу ответа, но я не знаю, как будет называться этот элемент, пока не получу ответ. Но когда я запускаю его, ссылка директивы запускается до того, как $http будет выполнено: фактическая последовательность
- $http.get запускается
- функция ссылки директивы run
- $http.get возвращает успех
Я немного знаком с $q, но не уверен, как его можно использовать для выполнения необходимых действий. Кстати, я показал только одно поле ввода, вызывающее директиву myField, но потенциально их много на странице, и всем им нужна одна и та же информация.
Отредактировано для добавления дополнительной информации в ответ на запрос:
У меня есть служба, которая возвращает структуру данных JSON. Я не знаю заранее, как именно будет выглядеть эта структура данных, но я могу понять это и сопоставить поля с полями ввода моей страницы. Я пытаюсь сделать это сопоставление в функции ссылки. Я рад сделать это в другом месте; Я мог бы сделать это в функции $http.success, но это было бы манипулированием DOM в контроллере; и я понимаю, что манипуляции с DOM должны выполняться только в директиве.
Вот как должен выглядеть мой HTML:
<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">
Ответ от сервера будет примерно таким:
{
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" }
]
}
]
}
Ответ сервера может отличаться, потому что:
- Может быть любое количество расширений ("MY_EXTENSION_NAME" и т. д.)
- Расширения могут быть возвращены в любом порядке
- Может быть любое количество полей
- Поля могут быть возвращены в любом порядке
Вся проблема здесь в том, что я хочу преобразовать "[MY_EXTENSION_NAME]myFieldName" в ng-модель "model.extensions[0].fields[0].value. Однако сейчас я думаю о преобразовании данных в каноническую форму во время чтения будет проще, поэтому ng-модель может быть просто «model.my_extension_name.myFieldName».
$watch
мог бы помочь. - person Beterraba   schedule 11.01.2014$compile
внутри функции ссылки? вы, вероятно, можете добиться того, что вам нужно, с изолированной областью, используя «@». пожалуйста, опишите, что вы хотите сделать. - person Ilan Frumer   schedule 11.01.2014