javascript - 在 Controller 中使用 angularJS 从 firebase 对象获取值

标签 javascript angularjs firebase firebase-realtime-database angularfire

我正在尝试通过服务访问 Controller 中的用户数据。服务正确返回对象

{
  "$id": "9ecadf8e-a233-48ac-bebf-26b50ea2855d",
  "$priority": null,
  "branch": "London",
  "email": "manager@london.co.uk",
  "firstName": "John",
  "lastLogin": 1467975594697,
  "lastLoginPrevious": 1467975348837,
  "lastName": "Smith",
  "role": "Manager"
}

当从 Controller 访问数据时,我可以使用

成功访问 $id
$scope.userData = UserService.getUserData();
console.log($scope.userData.$id)

但是当尝试访问任何其他节点(例如 Angular 色)时

$scope.userData = UserService.getUserData();
console.log($scope.userData.role)

我只是在控制台中得到“未定义”。显然我没有正确执行此操作,而是坚持下一步应该尝试的内容。

这是我从 firebase 检索数据的服务

.service('UserService', ['$location', '$firebaseAuth','$firebaseObject', function ($location, $firebaseAuth, $firebaseObject) {
var userData = '';
var ref = new Firebase("https://firebase-url");
var authData = ref.getAuth();
var userUID = authData.uid;
var userRef = new Firebase("https://firebase-url/Users/" + userUID);
var userData1 = $firebaseObject(userRef);


return {

    getUserData: function () {
        if (userData == '') {
          userData =  userData1;
        }
        return userData;
    },

};

最佳答案

您可能遇到异步问题。以下是我在 Controller (Firebase 3.0) 中的代码示例:

// Gets reference to resources tree, SERVICE CALL
$scope.resourceNames = submissions.getResourceNames();
// Could be previously loaded, check
if(Object.keys($scope.resourceNames).length === 0 && $scope.resourceNames.constructor === Object) {
    // Get reference
    var resourceNameRef = firebase.database().ref("/resourceNames");
    firebase.database().goOnline();
    // Return JSON object of data at specified location
    $scope.resourceNames = $firebaseObject(resourceNameRef);
    // When resources loaded
    $scope.resourceNames.$loaded().then(function(data) {
        // Store into service, SERVICE CALL
        submissions.setResourceNames(data);
        // DO WHATEVER
    }).catch(function(error) {
        console.error("Error:", error);
    });
} else {
    // WAS ALREADY LOADED
}

我所做的是检查服务以查看数据是否已加载(由另一个 Controller ),如果没有,我调用数据,等待它加载,然后将其存储在我的服务中。

然后我可以在 Controller 内或 View 中随意使用数据:

<p>
    {{resourceNames.$id}}
</p>
<p>
    {{resourceNames.name}}
</p>
<!-- etc -->

关于javascript - 在 Controller 中使用 angularJS 从 firebase 对象获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38265272/

相关文章:

javascript - 替换给定的 <img> 来源

javascript - 带有 angularjs 插件的多个粘性 header

javascript - 将类添加到最可见的 div jquery

javascript - 网格/表格中的高级过滤器用于 Angular

ruby-on-rails - Angular $http.get 无法从 Rails 获取 json respond_to (无需调整 header )?

javascript - firebase.auth(...).signInWithEmailAndPassword 不是 Cloud Function 中的函数

javascript - 如何阻止任何人滥用我的联系页面

angularjs - RxJS 和 WebWorker

ios - Firebase queryEqualToValue 在 Swift 2.3 中获取 Key

reactjs - 如何将 firebase 的 firestore/admin sdk 与 next.js 一起使用