0

我一直在解決這個問題大約一週,現在沒有任何進展。我有一系列可用於我的$scope的數據。我這樣迭代:AngularJS + Firebase - 獲取遠程數據時不會更新

<div ng-repeat="device in myData"> 
    <label>{{processor(device.$id)}}</label> 
</div> 

該數據僅包含Firebase $uid。我想向數據庫發出第二次請求,以獲取與$uid相關的信息,並將其作爲標籤的內容。我想我可以使用帶有函數的角度表達式來傳入Firebase $uid並返回一些數據。

我宣佈這個$scope功能:

$scope.processor = function(uid) { 
    function getDeviceInfo(callback) { 
      _.child('device/' + uid).once('value', function(snapshot) { 
       callback(snapshot.val()) 
      }) 
    } 
    getDeviceInfo(function(data) { 
      console.log(data) 
      return data 
    }) 
} 

基本上我打電話processor($id)在我的範圍,傳遞uid我想查找。函數getDeviceInfo()運行並有回調,當數據返回時,我將其記錄到控制檯,這是完美的,所有的數據都在那裏。但是當我嘗試將值返回給$scope時,它不會更新。

我已經嘗試了可用的Angular/AngularFire代碼的每個組合,並沒有得到任何工作,任何想法?

+0

嘗試cal l'$ scope。$ apply();'改變'$ scope'後。 – Titus

+0

我已經試過了,我得到了:'$ digest已經在進行中了' –

+0

哦,現在我明白了,你的'processor'函數不會返回任何東西。 – Titus

回答

1

如果執行異步,你作爲參數傳遞給once功能的功能,你不能從processor函數返回的數據。

您可以做的最好的方法是將結果數據添加到設備對象或創建另一個對象以容納所有設備的所有數據。

試試這個:

<div ng-repeat="device in myData"> 
    <label>{{device.data}}</label> 
</div> 

$scope.processor = function(device) { 
    _.child('device/' + device.$id).once('value', function(snapshot) { 
      device.data = snapshot.val(); 
    }); 
    } 
} 
$scope.myData.forEach($scope.processor); 

或者這樣:

<div ng-repeat="device in myData"> 
    <label>{{deviceData[device.$id]}}</label> 
</div> 

$scope.deviceData = {}; 
$scope.processor = function(device) { 
    _.child('device/' + device.$id).once('value', function(snapshot) { 
      $scope.deviceData[device.$id] = snapshot.val(); 
    }); 
    } 
} 
$scope.myData.forEach($scope.processor); 

如果功能不ASYNCH你可以使用這樣的返回數據:

$scope.processor = function(uid) { 
    var data = undefined; 
    _.child('device/' + uid).once('value', function(snapshot) { 
     data = snapshot.val() 
    }) 
    return data 
} 

reference

+0

看着這個,它確實符合我的要求,所以我會將其標記爲我的答案,謝謝!然而,我看過這篇文章後:http://stackoverflow.com/a/3373953/7371916,找到另一種解決方案。我會將它添加到您的帖子中以供將來的用戶使用。非常感謝您的幫助。 –

+0

@ClarkMcCauley如果函數是異步的,那麼您提到的答案中的解決方案將不起作用。這是因爲''處理器'函數將在'data'變量被設置之前返回。 – Titus

+0

是啊,這讓我難住,因爲'_。孩子的firebase查詢需要時間來響應,那麼它如何正確工作? –

1

你的函數沒有返回任何東西。試試這個:

$scope.processor = function(uid) { 
    function getDeviceInfo(callback) { 
    _.child('device/' + uid).once('value', function(snapshot) { 
     callback(snapshot.val()) 
    }) 
    } 
    return getDeviceInfo(function(data) { 
    console.log(data) 
    return data 
    }) 
} 

這似乎過於複雜,但爲什麼不這樣做?

$scope.processor = function(uid) { 
    return _.child('device/' + uid).once('value', function(snapshot) { 
    return callback(snapshot.val()); 
    }) 
} 
+0

也試過了。將$ {'}返回到$ scope。 –

相關問題