2015-07-03 20 views
11

$ scope.advertiserName için nasıl $ söz verilir? Aşağıdaki örnekte, Console.log ($ scope.title) "undefined" değerini döndürür.Sözlüğe nasıl atanır?

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

Ne sorduğun belli değil. "$ Promise" öğesini "advertiserName" olarak atamak ister misiniz? Şu anda, muhtemelen, sonucu 'advertiserName' olarak doğru bir şekilde atamanız gerekiyor. sorun ne burada? –

cevap

1

Sizi düzeltiyorsam, bu eşzamansız çağrı nedeniyle oluyor.

Asenkron, normal çalışma akışı dışarı alınır isteği göndererek (ya da daha doğrusu yanıt alma) anlamına gelir. Örneğinizde, $ .ajax hemen döner ve bir sonraki ifade, sonuç döndürür ;, iletilen işlevden önce yürütülürken, geri dönüş çağrısı bile çağrıldı.

Sen

$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 

Edit 1 gibi yapmak gerekir:

Aynı için çok makale okudum ve asynchronous çağrısının yanıtı normal dışarı alınacaktır fark nedir yürütme akışı. restangule veya $http numaralı çağrıları kullanırsanız, ikisi de asynchronous numaralı çağrıdır. Yani derleyici cevabınızı beklemez. Derleyiciye ajax yanıtını beklemesini söylemelisiniz. Projelerimden birinde neler yaptım. İşte daha fazla örnek gösterebilecek basit bir örnek.

İlk önce bir denetleyici işlevi bildirdim.

$scope.asynchronousCallee = function(){ 
$http.get('/url'). 
    success(function(data, status, headers, config) { 
    $scope.myAjaData = data; 
    }); 
} 

$scope.asynchronousCallee(); //Call above function just after the declaration 

Basitçe bu fonksiyon bu başarı işlevi bir get çağrıyla sunucudan veri almak ve değişkendeki yanıtı atamak ama unutmayın aşağıda gibi asynchronously çağrılır. Ne yaptım, bildirimin hemen ardından asynchronousCallee işlevini aradım. Şimdi derleyici bu fonksiyonun cevabını bekleyecek ve fonksiyonu yürüttükten sonra derleyici daha da ilerleyecektir. Onu seni Biz geri arama özelliği http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/ müthiş açıklama için bu blogu ziyaret edebilirsiniz ajax call.You tepkisini aldıktan sonra kod satırları yürütmek için geri arama işlevini kullanabilirsiniz :-)

+0

Aslında söylediğim gibi senkronize arama arıyorum. Teşekkürler Vineet. Ancak $ scope.title $ scope.someFunction tamamlanmadan önce yürütülüyor. $ Scope.scomeFunction yürütüldükten sonra scope.title yanında kod çalıştırmak istiyorum. – Inaccessible

+0

@Burakabilir, düzenlenmiş cevabımı kontrol et. Benim için çok iyi çalışıyor. Umarım senin için de çalışacaktır :-) – 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

kardeşi yardımcı olabilir umuyoruz. Kod aracılığıyla anlayalım.

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

Biz $scope değişkenleri aynı dosyanın içine doğrudan ulaşılabilir olarak $scope.setNameId fonksiyonun argüman $scope.title ve $scope.id değişken geçirmeden olmadan bu yaklaşımın

$scope.setNameId(executeAfterResponse); 

tarafından bunu da yapabilirsiniz.

Doğrudan $scope.name ve $scope.id değerlerini atadığımızdan, kod satırlarının girilmesine gerek yoktur.

1

Aşağıdaki örnekte, advertiserName öğesinin bellek başvurusu ve sürdürülecek title ve advertiserId ve kimliği bekleniyor. Bununla birlikte, özellikleri kapsam dışına çekerken, referans olarak değil, değere göre alınır.yerine referans güncellemesinden

Restangular.all('advertiser').one("?id=" + 1).getList().then(function(data) { 
    $scope.title = data.name; 
    $scope.id = data.id; 
}); 

bir Make:

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; 

kapsamına doğru özelliğini başlatın: Eğer kod çalışması için isteseydim iki şeyden birini yapmak zorunda kalacak

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

açısal kullanımı yoluyla sözler zaten görünümü daha sonra güncellenecektir bir özet döngüsünü tetikleyen yana