如何为$ scope.advertiserName分配$ promise?在下面的示例中,Console.log($ scope.title)返回“undefined”。
Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
$scope.advertiserName = data.name;
$scope.advertiserId = data.id;
});
$scope.title = $scope.advertiserName;
$scope.id = $scope.advertiserId;
答案 0 :(得分:3)
我们可以使用回调函数在获得ajax调用响应后执行代码行。您可以访问此博客,以获得回调函数http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/的精彩解释。让我们通过代码了解它。
$scope.setNameId = function (title,id,callBackFunction) {
Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
// $scope.advertiserName = data.name;
$scope.title= data.name;
// $scope.advertiserId = data.id;
$scope.id=data.id;
callBackFunction();
});
}
$scope.setNameId($scope.title,$scope.id,executeAfterResponse);
var executeAfterResponse=function(){
//code that you want to execute when value of $scope.title and $scope.id has changed
};
我们也可以通过这种方法来实现
$scope.setNameId(executeAfterResponse);
如果$scope.title
函数的参数中没有传递$scope.id
和$scope.setNameId
变量$scope
,则可以在同一文件中直接访问变量。
我们不会直接为$scope.name
和$scope.id
分配值,因此不需要注释代码行。
答案 1 :(得分:1)
如果我告诉你的话,这是因为异步调用而发生的。
异步表示发送请求(或者更确切地说是接收响应)将从正常执行流程中取出。在你的例子中, $ .ajax立即返回,下一个语句返回结果;是 在您传递的函数之前执行,因为成功回调是偶数 调用。
你应该这样做
$scope.someFunction = function () {
Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
return $scope.advertiserName = data.name;
});
}
$scope.title = $scope.someFunction(); //It will give you output
修改1:
我读了很多同样的文章,我注意到asynchronous
调用的响应将从正常的执行流程中取出。您使用restangule
或$http
来电,都是asynchronous
来电。因此编译器不会等待您的响应。您需要告诉编译器等待ajax响应。我在其中一个项目中做了什么。这是一个简单的例子,可以说明更多。
首先我声明了一个控制器功能。如下所示
$scope.asynchronousCallee = function (){
$http.get('/url').
success(function(data, status, headers, config) {
$scope.myAjaData = data;
});
}
$scope.asynchronousCallee(); //Call above function just after the declaration
只需此函数将通过get
调用从服务器接收数据并在变量中分配响应,但请注意此成功函数将被称为asynchronously
。所以我做了什么,我在声明之后就调用了asynchronousCallee
函数。现在编译器将等待此函数的响应,并在执行该函数后,编译器将继续进行。我希望它可以帮助你兄弟: - )
答案 2 :(得分:1)
在下面的示例中,您希望维护advertiserName和title以及advertiserId和id的内存引用。但是,当从属性中提取属性时,它将通过值而不是通过引用来检索。如果您想使代码工作,则必须执行以下两项操作之一:
Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
$scope.advertiserName = data.name;
$scope.advertiserId = data.id;
});
$scope.title = $scope.advertiserName;
$scope.id = $scope.advertiserId;
在范围内初始化正确的属性:
Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
$scope.title = data.name;
$scope.id = data.id;
});
改为通过引用更新:
var advertiser = {
id: $scope.advertiser,
title: $scope.advertiser
}
$scope.advertiser = advertiser;
Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
advertiser.title = data.name;
advertiser.id = data.id;
});
由于通过使用角度的承诺已经触发了摘要周期,因此视图将被更新
答案 3 :(得分:0)
Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) {
$scope.advertiserName = data.name;
$scope.advertiserId = data.id;
return { name : data.name, id : data.id };
}, function(er){
//Handle error
})
.then(function(response){
$scope.title = response.name;
$scope.id = response.id;
}, function(er){
//Handle error
});