如何在用户首次加载应用时在Firebase中创建初始数据结构?

时间:2014-01-18 18:27:45

标签: angularjs firebase angularfire

我有一个AngularJS应用程序,我希望将各种页面状态保存到Firebase中。因此,例如,当用户第一次访问应用程序时的初始数据结构在控制器函数中初始化,如下所示:

$scope.sections = {
  sectionA = true,
  sectionB = true,
  sectionC = true,
};

然后我将其绑定到Firebase位置:

var fb = $firebase(new Firebase('http://myapp.firebaseio.com/settings/sections'));
fb.$bind($scope, 'sections');

这似乎首先起作用。当我更改$ scope.sections对象中的值时,Firebase Forge视图也会显示更改的值。但是,当我重新加载页面时,它会将Firebase中的值重置为默认值。

如何在重新加载页面时初始化默认值而不覆盖?

修改

如果加载的值为null,我尝试使用加载的事件来设置默认值:

$scope.sections = {}
var fb = $firebase(new Firebase('http://myapp.firebaseio.com/settings/sections'));
fb.$bind($scope, 'sections');
fb.$on('loaded', function(value) {
  if (value == null) {
    $scope.sections = {
      sectionA = true,
      sectionB = true,
      sectionC = true,
    };
  }
});

但是虽然默认值是短暂可见的,但几乎/所有默认值都会立即重置。我怀疑这可能是由于我如何使用这些特定设置 - 它们绑定到Angular UI-Bootstrap Accordion指令的isOpen属性,以控制页面的哪些部分是打开/可见的。控件正在工作的方式是将部分/全部部分重置为关闭,即假,即使我的默认部分已打开所有部分。

EDIT2:

我已经解决了上面描述的问题。我使用的Angular-UI Bootstrap版本在评估isOpen属性的方式上有一个bug。从更高版本应用修复程序后,它按预期工作。

2 个答案:

答案 0 :(得分:3)

AngularFire已将$on('loaded')更改为$loaded()

var defaults = {...};
var ref = new Firebase("https://myapp.firebaseio.com/settings");
var sync = $firebase(ref);
var syncObject = sync.$asObject();
syncObject.$bindTo($scope, "settings");
syncObject.$loaded(function(data) {
  if ('$value' in data && data.$value == null) {
    sync.$set(defaults);
  }
});

答案 1 :(得分:1)

您可以使用“已加载”事件执行此操作,该事件将返回存储在Firebase中的当前值

// the initial value to be written
var defaults = {...};

// 3-way bind to Firebase
var fb = $firebase(new Firebase('http://myapp.firebaseio.com/settings'));
fb.$bind($scope, 'settings');

// wait for data to load
fb.$on('loaded', function(value) {
   // check if it has a value, if not, use defaults
   if( value === null ) { $scope.settings = defaults; }
});