【问题标题】:Run a function only the first time when AngularJS gets loaded仅在第一次加载 AngularJS 时运行一个函数
【发布时间】:2021-01-29 18:58:48
【问题描述】:

我正在使用 angular-seed 模板 (AngularJS) 并且我有 routeProvider 设置等,现在我想执行一个函数(驻留在工厂中),但只有在页面加载的第一次.我为此找到了许多解决方案,但我不想每次用户在选项卡之间切换时都执行代码(当然,通过routeProvider,页面不会重新加载) - 代码必须仅在整个页面时执行被(重新)加载。

我应该如何处理这个问题?我尝试从run 调用该函数,然后在页面加载时广播事件,但没有事件监听器 - 我猜这是因为run 部分在控制器设置之前执行,所以没有监听器在活动播出时附上。

那么,有什么建议可以解决这个问题吗?

更新

用例:

  • 当用户在页面中输入 url 时,页面被加载
  • 页面加载后,会执行$http.get 请求,获取随机内容
  • 此内容只能通过单击按钮来更改,以明确请求更改内容。
  • 如果用户点击不同的页面,例如view2 (routeProvider) 再回到view1,内容不能改变
  • 当用户刷新页面 (F5) 时,内容会再次更改(或者如前所述,通过单击按钮)

【问题讨论】:

标签: angularjs


【解决方案1】:

使用run 方法:

app.run(function(yourService){
  yourService.cacheRandomContent();
});

它只在应用启动并创建服务后运行一次。

要访问控制器中的数据,只需注入相同的服务:

app.controller('someCtrl',function($scope, yourService){
  yourService.getCachedRandomContent().then(function(resp){
    $scope.data = resp.data;
  });
});

您的服务将类似于:

app.service('yourService',function($http){
  var promise;
  return {
   cacheRandomContent: function(){
     promise = $http.get();
   },
   getCachedRandomContent : function(){
       return promise;
   }
  }
});

【讨论】:

  • 我试过了,但是如何将数据从factory 发送到我实际显示初始数据的controller
  • @uglycode 不能在控制器中注入这个服务并访问数据吗?这正是您所要求的。也许您想提供更多详细信息。
  • 我已经提供了一个我想要的用例,刷新我最初的问题
  • @uglycode 你能检查答案中的更新并解释为什么你不能这样做吗?
  • 好的,我会尝试实现这一点,但与此同时,如果app.run 中的yourService.someMethod(); 需要很长时间,而controller 之前被初始化怎么办?那么controller 中的getData 会返回null,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 2014-07-14
  • 2021-11-22
相关资源
最近更新 更多