2015-07-03 111 views
11

如何分配$承諾$ scope.advertiserName?在下面的例子中,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

這甚至不清楚你在問什麼。你想把'$ promise'賦給'advertiserName'?現在你已經可能將結果正確地分配給'advertiserName';這裏有什麼問題? –

回答

1

如果我得到您正確的,這是因爲異步調用發生。

異步裝置發送請求(或更確切地說在接收到響應)被取出的正常執行流程。在你的榜樣,立即 $就退貨和下一條語句,返回結果是;,你 作爲傳遞成功回調甚至被 調用該函數之前執行。

你應該做這樣

$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功能。現在編譯器會等待這個函數的響應,並且在執行該函數之後,編譯器會繼續進行。我希望它可以幫助你的兄弟:-)

+0

我真的在尋找像你說的同步呼叫。謝謝Vineet。但$ scope.title在$ scope.someFunction完成之前得到執行。我也想在$ scope.scomeFunction執行後執行scope.title旁邊的代碼。 – Inaccessible

+0

@無法訪問,請查看我編輯的答案。它對我很好。我希望它也適用於你:-) – Vineet

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 
}); 
3

我們可以利用回調函數讓AJAX call.You的響應可以訪問這個博客的回調函數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.setNameId函數的參數傳遞$scope.title$scope.id變量$scope變量可以直接同一個文件內進行訪問。

由於我們直接將值分配給$scope.name$scope.id,因此不需要註釋代碼行。

1

在下面的示例中,您期望保持advertiserName和title和advertiserId和id的內存引用。但是,如果將屬性從範圍中提取出來,則按值而不是按引用進行檢索。如果你想使你的代碼工作,你必須做兩件事情之一:通過基準數據更新,而不是

Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) { 
    $scope.title = data.name; 
    $scope.id = data.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; 

初始化示波器上的正確的屬性

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

由於通過使用角承諾已經觸發一個摘要週期那麼該視圖將被更新