Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 路线参数更改时,工厂中的AngularFire更改参考_Javascript_Angularjs_Firebase_Angularfire - Fatal编程技术网

Javascript 路线参数更改时,工厂中的AngularFire更改参考

Javascript 路线参数更改时,工厂中的AngularFire更改参考,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,我目前正在使用firebase(使用angularFire)开发angular应用程序,许多工厂都提供firebase阵列和对象 每当路由参数“element_id”更改时,我需要在会话中多次更改所有工厂的引用,但angularjs会在第一次调用它们时加载所有工厂,我看不到在首次调用之后更新引用的方法 我已尝试使用重新加载应用程序 $route.reload(); 这一切都没有改变 $window.location.reload(); 这可能导致错误404,因为此页面在html5模式下不可用

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

每当路由参数“element_id”更改时,我需要在会话中多次更改所有工厂的引用,但angularjs会在第一次调用它们时加载所有工厂,我看不到在首次调用之后更新引用的方法

我已尝试使用重新加载应用程序

$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
调用工厂?此外,这种方法是否也适用于多个工厂?