Javascript 路线参数更改时,工厂中的AngularFire更改参考
我目前正在使用firebase(使用angularFire)开发angular应用程序,许多工厂都提供firebase阵列和对象 每当路由参数“element_id”更改时,我需要在会话中多次更改所有工厂的引用,但angularjs会在第一次调用它们时加载所有工厂,我看不到在首次调用之后更新引用的方法 我已尝试使用重新加载应用程序Javascript 路线参数更改时,工厂中的AngularFire更改参考,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,我目前正在使用firebase(使用angularFire)开发angular应用程序,许多工厂都提供firebase阵列和对象 每当路由参数“element_id”更改时,我需要在会话中多次更改所有工厂的引用,但angularjs会在第一次调用它们时加载所有工厂,我看不到在首次调用之后更新引用的方法 我已尝试使用重新加载应用程序 $route.reload(); 这一切都没有改变 $window.location.reload(); 这可能导致错误404,因为此页面在html5模式下不可用
$route.reload();
这一切都没有改变
$window.location.reload();
这可能导致错误404,因为此页面在html5模式下不可用localhost:8000/element1不存在,或者在我不使用html5模式时,将我带回了localhost:8000,但没有我的元素id
下面是我的一个工厂和我的根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
。在控制器内部使用,或者更好地使用路由器
尝试从core\u 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;
}
工厂都是单身汉。如果您希望在路由更改时更改某些内容,如
core\u data
,则应将其放入路由的解析程序功能中。请注意,$routeParams
仅在路由更改成功完成后更新。这意味着您不能依赖于路由解析函数中的$routeParams
是正确的。相反,您可以使用$route.current.params
访问新路由的参数。--。您还需要路由中的参数。类似于.when('/somepath/:element_id'
很好,谢谢,看起来很优雅!我仍在试图找出函数MyController(data){
以及如何将coreData工厂的结果分发到多个控制器。是否有解决方案,或者我应该在每个需要这些数据的控制器中使用$routeParams
调用工厂?此外,这种方法是否也适用于多个工厂?