foo*_*sus 2 angularjs angularjs-directive
我需要在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>
Run Code Online (Sandbox Code Playgroud)
在这里,我需要将输入字段绑定到响应的元素,但在得到响应之前,我不知道该元素将被调用.但是当我运行它时,指令的链接在$ http完成之前运行:实际的序列是
我对$ 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">
Run Code Online (Sandbox Code Playgroud)
服务器的响应如下:
{
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" }
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
服务器的响应可能会有所不同,因为:
这里的整个问题是我想将"[MY_EXTENSION_NAME] myFieldName"转换为ng-model"model.extensions [0] .fields [0] .value.但是,我现在正在考虑在阅读过程中将数据转换为规范形式将更容易,因此ng-model可以只是"model.my_extension_name.myFieldName".
目前尚不清楚你想要实现的目标(我很确定会有更好的方法),但你可以这样做:
1.
在您的范围内定义承诺:
app.controller('myCtrl', function ($http, $scope) {
$scope.model = {
promise: $http.get('/my/service'),
myField01: 'Hello, world, from 01 !',
myField02: 'Hello, world, from 02 !',
myField03: 'Hello, world, form 03 !'
};
});
Run Code Online (Sandbox Code Playgroud)
2.
从您的HTML中引用该承诺,以便将其传递给您的指令:
<input type="text" my-field="model.promise" />
Run Code Online (Sandbox Code Playgroud)
3.
将此承诺纳入指令的隔离范围:
app.directive ('myField', function ($compile) {
return {
scope: { promise: '=myField' },
...
Run Code Online (Sandbox Code Playgroud)
4.
在你的link函数中,注册一个回调函数,以便在你的请求得到解决时(即你得到对你的请求的响应)并进行所有必要的操作:
...
link: function (scope, elem, attrs) {
scope.promise.success(function (data) {
elem.removeAttr('my-field');
elem.attr('ng-model', 'model.' + data.fieldName);
$compile(elem)(scope.$parent);
});
}
Run Code Online (Sandbox Code Playgroud)
另见这个简短的演示.