Angularjs 路由更改时不加载来自firebase的数据,但在刷新时加载

Angularjs 路由更改时不加载来自firebase的数据,但在刷新时加载,angularjs,firebase,angularfire,Angularjs,Firebase,Angularfire,我使用angularFire和Angular来更新一些视图,但奇怪的是,当我从一个视图切换到另一个视图时,数据不会加载,但当我刷新页面时,数据会加载。发生什么事了 向导控制器: /* initialize data */ var ref = new Firebase('https://dlwj.firebaseio.com/'); /* set data to automatically update on change */ $scope.currentLocation = $route

我使用angularFire和Angular来更新一些视图,但奇怪的是,当我从一个视图切换到另一个视图时,数据不会加载,但当我刷新页面时,数据会加载。发生什么事了

向导控制器:

/* initialize data */

var ref = new Firebase('https://dlwj.firebaseio.com/');

/* set data to automatically update on change */

$scope.currentLocation = $route.current.$$route.originalPath;
$scope.propertyRef = $firebase(ref);

$scope.propertyRef.$on('loaded', function(value) {

  //value will be undefined when I switch views using hash routes.
  //there is no issue when I just refresh on that page.
  console.log(value); 
  $scope.propertyConfiguration = value.products;
  var products = [];
  for (var key in value.products) {
    if (value.products.hasOwnProperty(key)) {
      products.push(key);
    }
  }

  $scope.productsArray = products;

});

console.log('Data retrieved');
路线:

$routeProvider.when('/SharedProperties',
{
  templateUrl: 'partials/SharedPropertiesPartial.html',
  controller: 'WizardController'
});

$routeProvider.when('/Registration',
{
  templateUrl: 'partials/Registration.html',
  controller: 'WizardController'
});

$routeProvider.when('/Login',
{
  templateUrl: 'partials/Login.html',
  controller: 'WizardController'
});

没有理由使用$firebase这样的包装库(负责同步等)下载数据,然后立即将数据取出并放入不同的范围对象中

只需声明您的范围变量:

$scope.products = $firebase(ref);
使用它:

<ul>
   <li ng-repeat="product in products | orderByPriority">{{product|json}}</li>
</ul>
如果您想将Firebase用作静态数据库(对于像我这样的实时爱好者来说,这是相当令人费解的),而不是在每次发生更改时都得到通知,您可以简单地执行以下操作:

angular.controller('MyController', function($timeout, $scope) {
   new Firebase('<URL>').once('value', function(snap) {
      $timeout(function() {
         $scope.products = snap.val();
      });
   });
});
angular.controller('MyController',函数($timeout,$scope){
新Firebase(“”).once('value',函数(快照){
$timeout(函数(){
$scope.products=snap.val();
});
});
});
然后正常使用它:

<ul>
   <li ng-repeat="(key,product) in products">{{key}}: {{product|json}}</li>
</ul>
  • {{key}}:{{product | json}

没有理由使用$firebase这样的包装库(负责同步等)下载数据,然后立即将数据取出并放入不同的范围对象中

只需声明您的范围变量:

$scope.products = $firebase(ref);
使用它:

<ul>
   <li ng-repeat="product in products | orderByPriority">{{product|json}}</li>
</ul>
如果您想将Firebase用作静态数据库(对于像我这样的实时爱好者来说,这是相当令人费解的),而不是在每次发生更改时都得到通知,您可以简单地执行以下操作:

angular.controller('MyController', function($timeout, $scope) {
   new Firebase('<URL>').once('value', function(snap) {
      $timeout(function() {
         $scope.products = snap.val();
      });
   });
});
angular.controller('MyController',函数($timeout,$scope){
新Firebase(“”).once('value',函数(快照){
$timeout(函数(){
$scope.products=snap.val();
});
});
});
然后正常使用它:

<ul>
   <li ng-repeat="(key,product) in products">{{key}}: {{product|json}}</li>
</ul>
  • {{key}}:{{product | json}

这是什么版本的angularFire?为什么要将值推送到“加载”中的数组中,而不是让$firebase处理$scope.products中的同步?我们为什么要使用数组?如果将console.log放在加载的回调中会发生什么;它只在重新加载时启动,而不是视图开关,对吗?版本是0.6.0。我不确定$firebase处理同步是什么意思,但我使用firebase作为静态数据源,所以我不希望productsArray发生变化。“loaded”回调中的console.log()总是在运行,它要么在view2view开关上输出未定义的数据,要么在页面刷新时输出实际数据。尝试将console.log放在加载的回调中(它当前在该方法之外)。我可能有误解,但这会像
$scope.propertyRef.$on('loaded',function(){console.log()})
?B/c那里已经有一个了。这是什么版本的angularFire?为什么将值推送到“loaded”中的数组中,而不是让$firebase将同步处理到$scope.products中?为什么我们使用数组?如果将console.log放在加载的回调中会发生什么情况;它只在重新加载时触发,而不是在view开关中触发,对吗?版本是0.6.0。我不确定$firebase处理同步是什么意思,但我使用firebase作为静态数据源,所以我不希望productsArray发生更改。console.log()在“loaded”回调始终运行的内部,它要么在view2view开关上输出未定义的数据,要么在页面刷新时输出实际数据。请尝试将console.log放入加载的回调中(它当前在该方法之外)。我可能有误解,但这会像
$scope.propertyRef.$on('loaded',function(){console.log()})
?B/c那里已经有一个了。谢谢加藤,像往常一样提供了额外的详细答案!我实际上忘记了(密钥、产品),我所有的循环都只是试图获取密钥的一种黑客方式。你确定你的
$scope.products[key]
仍然有效?它打印的是未定义的。这与控制台中对象打印为
{$method1,$method2,property1,property2}
的问题非常相似,但是object.property1打印的是未定义的。找到答案:)需要将代码包装为$on('loaded')。处理异步调用有点棘手。啊,是的,你需要将其包装在$on('loaded')中。必须记住不要用速记编码:)为什么
$timeout
.once()中
,@Kato?@Kato是对的,我遇到了同样的问题,并提出了与这里相同的解决方案。它很有效。谢谢Kato,像往常一样提供了额外详细的答案!我实际上忘记了(密钥,产品),我所有的循环只是试图获取密钥的一种黑客方式。你确定你的
$scope.products[key]
仍然有效?它打印的是未定义的。这与控制台中对象打印为
{$method1,$method2,property1,property2}
的问题非常相似,但是object.property1打印的是未定义的。找到答案:)需要将代码包装为$on('loaded')。处理异步调用有点棘手。啊,是的,您需要将其包装为$on('loaded')。必须记住不要用速记编码:)为什么
中的
$timeout
。once()
,@Kato?@Kato是对的,我遇到了同样的问题,并提出了与此处相同的解决方案。它只是起作用。