当 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.
我目前正在使用 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.