0

私は約1週間は問題が進行していないので、問題に取り組んできました。私は$scopeに利用できる一連のデータを持っています。AngularJS + Firebase - リモートデータを取得する際にスコープが更新されない

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

データのみFirebase $uidが含まれています。私はこのようにそれを反復します。そして、私はこの$uidに関連する情報を取得するためにデータベースに2回目のリクエストを行い、それをラベルの内容として配置したいと考えています。 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 
    }) 
} 

は基本的に私は私がルックアップしたいuidに渡して、私の範囲でprocessor($id)を呼び出します。関数getDeviceInfo()が実行され、コールバックがあり、データが返されると、コンソールにログに記録されます。これは完璧に動作し、すべてのデータがそこにあります。しかし、私が試して$scopeに値を返すと、それは更新されません。

私はAngular/AngularFireコードを組み合わせて試してみましたが、何もできませんでした。

+0

お試しください'$ scope。$ apply();'を実行してください。 – Titus

+0

私はすでにこれを試しています: '$ digest already in progress' –

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

またはこの:

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

reference

<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されていない場合

+0

これを見て、それは私が持っているもので動作するので、私はこれを私の答えとしてマークします、ありがとう!私はしかし、このポストを見て回った:http://stackoverflow.com/a/3373953/7371916、別の解決策を見つける。今後のユーザーのためにあなたの投稿に追加します。ご助力ありがとうございます。 –

+0

@ClarkMcCauleyあなたが言及した答えの解決策は、機能が非同期の場合は機能しません。これは 'data'変数が設定される前に' processor'関数が戻るためです。 – 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に '{}'を返します。 –

関連する問題