如何为范围分配承诺

时间:2015-07-03 12:37:07

标签: angularjs restangular

如何为$ 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;

4 个答案:

答案 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
});