当路由参数更改时,工厂中的角度火更改引用

AngularFire change reference in factory when routeParameter changes

本文关键字:引用 路由 参数 工厂      更新时间:2023-09-26

我目前正在开发一个带有Firebase(使用angularFire)的角度应用程序,许多工厂都提供Firebase阵列和对象。

每当路由参数"element_id"发生变化时,我需要在会话中多次更改所有工厂的引用,但 angularjs 在首次调用后加载所有工厂,并且我看不到在此初始调用后更新引用的方法。

我尝试使用

$route.reload();

什么也没改变,而且

$window.location.reload();

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

这是我的工厂之一,我的根火力基地工厂:

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。在控制器内部使用它,或者更好的是,在路由器内部使用它。

尝试从 core_data 工厂返回一个函数,该函数可以基于 id 构造$firebaseObject

然后在路由中的 resolve 对象中,您可以访问$routeParams并构造一个$firebaseObject 。然后你可以返回$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;
} 

如果您想知道,格式来自 角度样式指南.