AngularJS:在模型和视图之间异步收集附加数据
AngularJS: Collecting additional data asynchronously between the model and view
我刚开始使用Angular,遇到了一些关于在视图和模型之间异步转换数据的问题。假设我有一个列出用户及其姓名的表格:
+--------------------------------------------------------+
| Username First Name Last Name |
| -------------------------------------------------------|
| [______________] ... ... |
| [______________] ... ...
+ -------------------------------------------------------+
每行(在username
字段中)有一个输入。First Name
和Last Name
字段为明文,用户不可编辑我希望能够在输入中输入用户名,进行REST API调用以查找该用户的数据库记录,并自动显示名字和姓氏(使用该记录)
例如,如果我输入用户名jsmith
,我希望它转到我的API并返回一个对象:
{
"username": "jsmith",
"firstname": "John",
"lastname": "Smith"
}
然后我想在表中显示这些名称,给我这个:
+--------------------------------------------------------+
| Username First Name Last Name |
| -------------------------------------------------------|
| [_jsmith_______] John Smith |
+ -------------------------------------------------------+
输入与ng-model="user"
绑定。我使用ngModelController
挂接到模型更新过程中,以获取用户对象,并在给定用户名时将其交换出去。
我做了一个指令,user-field
:
angular.module('directives').directive('userField', ['api', function (api) {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
if (!ngModel) return;
ngModel.$render = function () {
element.val(ngModel.$viewValue);
};
element.on('blur', function (e) {
scope.$apply(function () {
api.getUser({
filter: 'username = "' + element.val() + '"'
}, function (data) {
ngModel.$setViewValue(data[0]);
ngModel.$commitViewValue();
ngModel.$render();
// returns the entered user object that relates to the username
console.log(ngModel.$viewValue);
});
});
});
}
};
}]);
这是我的输入元素:
<input user-field ng-model="user" />
查看API回调中的console.log,用户键入的用户名将成功转换为从API返回的用户对象。然而
问题1:看起来这个值永远不会返回到控制器本身。如果我console.log
是我的控制器的$scope,那么user
的值就是undefined
(甚至不是常规的非转换用户名)。
问题2:即使我确实做到了,我也不认为这正是我应该做的。如果我将用户名字符串转换为对象,那么该字段将把文本切换为"[对象对象]",而不是用户名。有没有一个很好的已知的角度模式来做这种事情?
谢谢你的帮助。
问题1:不需要将ngModel传递给指令。只需定义一个属性并配置指令的本地作用域。
例如
HTML
<userfield user="model"></userfield>
AngularJS
angular.module('directives').directive('userField', ['api', function (api) {
return {
scope: {
user: '='
},
restrict: 'A'
};
}]);
'='
在控制器作用域和变量user
的指令作用域之间创建双向数据绑定。
问题2:我认为使用对象没有问题。您可以简单地访问用户对象的name
属性。
- 异步获取数据使用JavaScript同步获取数据
- 从要使用Protractor测试的服务器异步加载的动态数据列表的列表
- 将数据发布到iframe是同步还是异步
- 如何处理异步获取的数据
- Javascript/JQuery处理并发/异步调用和数据竞争
- 在我的案例中,如何获取异步数据
- 将数据注入异步回调(使用 node.js)
- 嵌套异步函数未及时返回数据的问题
- 如何将状态对象/数据传递给(异步)ajax 回调
- 如何等到异步回调完成后才能使用检索到的数据
- 使用从内部函数返回的异步数据对外部函数返回promise
- 异步循环使用递归:如何访问推送数组数据
- 在呈现“页面”之前异步获取数据
- 如何访问回调函数之外的异步angularjs服务数据
- 余烬数据异步关系的聚合
- 从Json数据异步加载谷歌地图标记
- 为什么Javascript检索数据异步(ajax,..),而PHP同步(mysql_query)
- 使用存储中的数据异步请求
- 如何在 AngularJS 中将数据异步从模型返回到控制器
- 想创建一个js插件,发送大量的数据异步到另一个服务器