Javascript 在AngularJS中,如何自动更新通过ajax获取的值?

Javascript 在AngularJS中,如何自动更新通过ajax获取的值?,javascript,angularjs,Javascript,Angularjs,我想做一个函数,从ajax URL获取一些信息。例如,在我的服务中,我将采用以下方法: this.getFavColor = function(id) { return $http.get('/colors/get/' + id); } 在我的控制器中,我将执行以下操作: $scope.favColor = UserService.getFavColor( id ); 但问题是,$scope.favColor在这种情况下将被分配一个承诺,而将其实际更改为ajax返回的值的唯一方法是在

我想做一个函数,从ajax URL获取一些信息。例如,在我的服务中,我将采用以下方法:

this.getFavColor = function(id)
{
    return $http.get('/colors/get/' + id);
}
在我的控制器中,我将执行以下操作:

$scope.favColor = UserService.getFavColor( id );
但问题是,
$scope.favColor
在这种情况下将被分配一个承诺,而将其实际更改为ajax返回的值的唯一方法是在承诺上设置一个
.success()
回调,并使用它来更新该值

但是,如果我有很多东西必须通过ajax获取,那么这很快就会变得很麻烦。有没有什么捷径,比如你可能会这样做

this.getFavColor = function(id, variableToChange)
{
    return $http.get('/colors/get/' + id).success(function(jsonResult)
       {
         variableToChange = jsonResult.favColor;
       });
}
然后在控制器中执行以下操作:

UserService.getFavColor( id, $scope.favColor );
这种方法真的有效吗


注意:我已经考虑过
$resource
,但是我无法为我的ajax设置REST api,所以请不要建议这样做。

$resource这样做的方式是立即返回一个空对象,然后在服务器收到响应后向该对象添加数据。这就是为什么$resource只能返回对象或数组,而不能返回原语

ng bind(以及缩写{}})实际上解决了承诺,因此这可能是一个更好的解决方案。我用三个不同的例子创建了一个plnkr:

//data.json:{“color”:“Blue”}
app.service('UserService',函数($http,$q){
返回{
//返回值可由{{value.data.color}访问
getFavColor:函数(id){
返回$http.get('data.json');
},
//返回值可由{{value}访问
getFavColorWithQ:函数(id){
var def=$q.defer();
$http.get('data.json').success(函数(数据){
解析(数据颜色);
});
回报承诺;
}
//返回值可由{{value.color}访问
,资源示例:函数(id){
var响应={};
$http.get('data.json').success(函数(数据){
response.color=data.color;
});
返回响应;
}
}
});

这应该可以。你试过了吗?我唯一的疑问是,因为return语句不是直接返回承诺,而是调用success方法。如果成功也能回报承诺,那就好了。否则,您不需要返回任何内容,也不需要先将承诺放入变量中,然后对其调用success,然后返回承诺。@Chandermani我没有尝试过它,但我更愿意使用
$resource
使用的任何方法来执行此操作。你看过
angular.resource.js
的代码了吗?你能知道它是怎么做到的吗?你不需要RESTAPI来使用
$resource
获取数据。只要数据是json,GET就可以正常工作。它只需要一个url来获取数据。请查看
http://stackoverflow.com/questions/11966252/how-does-the-resource-get-function-work-synchronously-in-angularjs
,我正在使用这里描述的方法来实现这一点。一旦它起作用了,我会发布一个答案。是否值得将您的favColor移到服务中而不是控制器中?我知道这不是你要问的,但它避免了问题。否则,你的控制器真的需要知道它是异步的,并自行处理承诺。对我来说,第三个选项似乎不会更新视图,似乎不会触发angularjs的手表<代码>$scope.$apply可能需要,但对我来说,
摘要已经在进行中了
消息。但是,第二种方法非常有效。第一种方法只返回承诺,您必须使用
success
回调,对吗?您看到我的plnkr示例了吗?它显示了所有方法的工作方式,您不必在其中任何一个方法中使用回调方法。但是第一个和第二个示例都返回承诺,只是第一个示例将承诺返回给响应对象,第二个示例将承诺返回给值