从 AJAX 调用返回的值未在 Angular JS 中的控制器中设置为变量
value returned from ajax call not getting set to variable in controller in angular js
HTML
<div id="SalaryDiv">
<div ng-controller="SalaryController as sal">
<div ng-repeat="salaryDetail in sal.data">
<p>{{salaryDetail.Name}}</p>
<p>{{salaryDetail.Salary}}</p>
</div>
</div>
</div>
.JS
(function () {
var salary = angular.module("SalaryDetails", []);
salary.controller("SalaryController", function () {
var newData = getAssociateData();
alert(newData); //here it is alerting as undefined
this.data = salaryDetails;
});
function getAssociateData() {
var returnData;
$.ajax({
url: "https://gist.githubusercontent.com/vigneshvdm/862ec5a97bbbe2021b79/raw/d7155b9c7fd533597c912fc386682e5baee1487a/associate.json",
type: "GET",
success: getDetails
});
function getDetails(data) {
salaryDetails = data;
return data;
};
};
}());
这里调用了成功函数,但是值没有被设定
1) 来自 getAssociateData
的返回值是 $.ajax
的返回值 - 这不是您返回的data
。 $.ajax
是异步调用。
2)你应该使用Angular的$http
而不是jQuery的$.ajax
- 这将自动将更改应用于视图(即它将代表你调用$scope.$apply()
)。
您似乎也希望this.data
是一个数组(我从使用ng-repeat="salaryDetail in sal.data"
收集,所以push
而不是分配。
salary.controller("SalaryController", function ($http) {
var url = "https://gist.gith....json";
var vm = this; // your "Controller As" ViewModel
vm.data = [];
$http.get(url).then(function(salaryDetail){
vm.data.push(salaryDetail);
}
}
这是为了说明。我同意这里的其他建议,即HTTP调用应该在服务中抽象出来,而不是将它们保留在控制器中。但是,一步一个脚印...
您应该使用 $http 服务。
salary.controller("SalaryController", function ($scope, $http) {
$scope.salaryDetails = null;
var url = 'https://gist.githubusercontent.com/vigneshvdm/862ec5a97bbbe2021b79/raw/d7155b9c7fd533597c912fc386682e5baee1487a/associate.json';
$http.get(url).
success(function (data) {
$scope.salaryDetails = data;
});
});
注意:我把它放在这里的控制器中,但作为最佳实践,您应该只将$http
依赖项注入到您的自定义服务中。
每当您尝试在控制器内部调用 ajax 调用时,它都不会触发角度摘要,因此控制器变量不会更新。
理想的方法是在工厂中执行此操作,然后从控制器调用工厂方法。
代码示例:
appModule.factory('Search', function($rootScope, $http, $q) {
return {
var deferred = $q.defer();
$http.get('https://gist.githubusercontent.com/vigneshvdm/862ec5a97bbbe2021b79/raw/d7155b9c7fd533597c912fc386682e5baee1487a/associate.json').success(function(response) {
deferred.resolve({
data: response)};
});
return deferred.promise;
}
});
此代码正在使用$q服务以使其更干净。现在只需将此工厂(搜索)注入控制器并按原样使用它。
相关文章:
- 通过连线将数据从js发送到控制器
- 如何根据条件加载Anguar.js控制器
- Angular.js延迟控制器初始化
- 为什么我的控制器没有启动函数.js脚本
- Angular JS控制器初始化错误
- Ember.js:将Em.$.getJSON转换为promise并将响应绑定到控制器上下文的正确方法
- Angular JS“;控制器为“;语法不起作用
- 如何将Ember.js控制器连接到视图
- 如何从页面中的jquery调用angular js函数控制器
- 将Browserify与Angular JS结合使用--将服务传递到控制器中
- Ember.js-自动使动作成为目标控制器
- 如何使用javascript express node将变量从控制器中的一个方法公开.js到另一个控制器.js
- 如何在 Ember 中循环排序的数组控制器.js
- 有没有办法在帆上扩展控制器.js
- 如何在用户使用护照登录的情况下测试帆.js控制器.js
- 如何从angular中的控制器js隐藏ng控制器之外的元素
- 我如何重构我的控制器.js,所以我有每个控制器在一个单独的文件
- 我如何调用一个函数定义在控制器.js从一个模态弹出
- AngularJS:如何知道表单中的输入文本在控制器JS文件中是否需要
- 在 Ember 中创建没有路由的子控制器.js