当 routeParameter 更改时,AngularFire 在工厂中更改引用

AngularFire change reference in factory when routeParameter changes

我目前正在使用 firebase(使用 angularFire)开发 angular 应用程序,许多工厂提供 firebase 数组和对象。

只要路由参数 "element_id" 发生变化,我就需要在一个会话中多次更改所有工厂的引用,但是 angularjs 会在第一次调用时加载所有工厂,而我没有查看在初始调用后更新引用的方法。

我尝试使用

重新加载应用
$route.reload();

什么都没改变

$window.location.reload();

导致错误 404,因为此页面在 html5 模式下不可用 localhost:8000/element1 不存在,或者在没有 element_id 的情况下将我带回 localhost:8000当我没有使用 html5 模式时。

这是我的根 firebase 工厂之一:

app.factory("fireroot", function(){
  var reference = new Firebase("https://mybase.firebaseio.com");
  return reference;
});

app.factory('core_data', function($firebaseObject, fireroot, $routeParams) {
  var reference = fireroot.child("elements").child($routeParams.element_id).child("core-data");
  var core_data = $firebaseObject(reference);

  return core_data;
});

非常感谢您的帮助,感谢这个社区,我才完成了过去几年的编码,终于是时候积极参与了:)。

是时候开始参与了!

不要在工厂中注入 $routeParams。在控制器内部使用它,或者更好的是 router.

尝试 return 使用 core_data 工厂中的函数,该函数可以根据 id 构建 $firebaseObject

然后在路由中的resolve对象中,可以访问$routeParams,构造一个$firebaseObject。然后您可以 return $loaded() 承诺,因此 Angular 将在承诺得到解决时加载视图。

现在您的控制器非常薄,因为配置为您完成了困难的部分。

angular.module('app', ['ngRoute', 'firebase'])
   .factory('coreData', CoreDataFactory)
   .controller('MyCtrl', MyController)
   .config(ApplicationConfig);

function CoreDataFactory($firebaseObject, fireroot) {
  return function(id) {
    var ref = fireroot.child("elements").child(id).child("core-data");
    return $firebaseObject(ref);
  }
}

function ApplicationConfig($routeProvider) {
  $routeProvider.when('/path/:element_id', {
    controller: 'MyCtrl as ctrl',
    view: 'view.html',
    resolve: {
      data: function(coreData, $route) {
         return coreData($route.current.params.element_id).$loaded();
      }
    }
  });
}

function MyController(data) {
  this.coreData = data;
} 

And incase you are wondering, the format comes from the Angular Styleguide.