Firebase同步处理

时间:2016-11-01 04:18:16

标签: angularjs firebase-realtime-database angularfire

我的数据结构如下:

-Company
       |
      -jskdhjJKHh-Yty
        -companyName:CompanyTH

-Employees
   |
  -shdjasjdshy665-333
      |
     -empName:Peter
      |
     -Company
       -jskdhjJKHh-Yty:true

我在Employees中推送ParentController的数据如下所示:

第1步:

var ref=firebase.database().ref("Employees");
var newKey=ref.push({empName:"John"}).key

设置2:

var childCompany=ref.child(newKey+'/Company');
childCompany.set(true);

第3步:

$scope.emplist=$firebaseArray(ref);

HTML

<div ng-repeat="emp in emplist" ng-Controller="ChildController">
    <p>{{emp.empName}}</p>
    <p>{{CompanyName}}</p>
</div>

ChildController

var companyRef=firebase.database().ref("Company/"+Object.keys($scope.emp.Company)[0]);
$scope.CompanyName=$firebaseObject(companyRef);

问题是:

执行Step 1时,将同步数据同步到$scope.emplist并为ChildController实例执行ng-repeatChildController中的代码尝试执行第{{1}行时它给出了Object.keys($scope.emp.Company)[0]未定义的错误。此错误导致Company未执行Step 2同步firebase之后的数据。但是当Step 1执行时,它会更新Step 2,但firebase-database会不会在ChildController实例的更新时执行。

我想到的一个解决方案是,我可以停止ng-repeat同步数据,直到所有推送查询完成为止?或者你们中的任何人有任何其他解决方案?

有一点需要注意:

上面提到的步骤在同一个应用程序会话中第二次再次运行时成功执行,很奇怪它不会在第一次尝试时运行。

1 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,那么您可能需要更改推送逻辑。

通过单个推送命令将数据保存在Firebase中的特定节点中总是很方便。据我所知,您尝试分两步推送数据Employees节点。真的有必要吗?您只需按一下即可轻松推送empNamechildCompany

ChildController中,您需要向该节点添加一个侦听器,您尝试使用ref.on尝试获取数据。因此,在Firebase数据库中成功存储数据后,您将收到回调。

var companyRef=firebase.database().ref("Company/"+Object.keys($scope.emp.Company)[0]);
companyRef.on("value", function(data) {
  // This will be triggered once there's a
  // change in data in the node the reference is referring to
  doSomething();
});

<强>更新

  

然后我怎么能在push中使用set(true)?

获取包含empNamechildCompany的单个对象。然后就像这样使用push。

// Get the firebase reference of your node
var ref = firebase.database().ref("Employees");

// Create an object first. 
var employee = {
  empName: "Peter",
  company: "CompanyTH"
};

// Pass the object that you've prepared earlier here. 
ref.push.set(employee);

这只是一个例子。您可以拥有嵌套对象。我们的想法是立即传递整个对象,并在Firebase中成功保存后添加回调。你也许会想到这样的事情。

ref.set(employee, function(error) {
  if (error) {
    doSomethingOnError();
  } else {
    doSomethingOnDataSavedSuccessfully();
  }
});

您可以尝试构建像这样的嵌套类

var employee = {
  empName: "Peter",
  Company: {
    companyName: "Name",
    uniqueID: true
  }
};