javascript - 确保 Angular Controller 中的函数只运行一次

标签 javascript angularjs

我有一个从我的服务调用函数的 Controller ,我只想从网络加载一次数据,并大概缓存它(在 rootScope 中?但这可以等待...)。

我尝试将函数调用包装在 init() 中,但它似乎没有帮助...我每次加载部分时都会看到函数被调用。

也许我的路由有些天真?

这是一些代码:

app.js

'use strict';

    var tab = angular.module('tab', ['ngRoute', 'tab.controllers', 'tab.services']);

    tab.config(['$routeProvider', function($routeProvider) {
      $routeProvider.

        // a bunch of other logic here

        when('/curate', {
            templateUrl: '_partials/curate.html',
            controller: 'CurateController'
        }).

      otherwise({
        redirectTo: '/splash'
      });
    }]);

controllers.js

// other controllers etc 

.controller('CurateController', function($scope, $routeParams, ParseService) {

  // Here's where I'm trying to call the function once.
  // Obviously, if I don't have this in the init() it also calls every time I route to it
  $scope.init = function () {
    ParseService.getArticles(function(results) {
      console.log("Articles: " + results);
      // do stuff with data here
    });
  };

})

services.js

angular.module('tab.services', []);

angular.module('tab.services')

/* PARSE */

.factory('ParseService', function() {

    // Vars etc

    var ParseService = {
      name: "Parse",


      // The function in question
      getArticles : function getArticles(callback) {
        var query = new Parse.Query(Article);
        query.find({
          success : function(results) {
            callback(results);
          },
          error : function(error) {
            alert("Error" + error.message);
          }
        });
      },

    };


    return ParseService;
});

curate.html

<section>
    <div class="container-fluid" ng-controller="CurateController" ng-init="init()">

        <!-- STUFF -->


    </div>
</section>

最佳答案

您没有展示您的服务。只需将其缓存在服务 $http 调用

中即可
$http.get(url, { cache: true}).success(...);

--- 更新

您应该从您的服务中返回 promise ,而不是将回调传递给它。

查看 Parse 文档,我无法找到一种自动为您缓存 web 数据的方法。

您可以实现自己的缓存机制,我建议在服务中,而不是在 Controller 中。

-- 编辑 2

请记住,服务是单例的。因此,根据设计,它只会被构建一次。

关于javascript - 确保 Angular Controller 中的函数只运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33665434/

相关文章:

jquery - 根据屏幕大小更改 CSS

javascript 带条件的多维数组中的数组值求和

javascript - 根据 var 值显示文本

javascript - 更改标签类的调试方法

Javascript sin函数问题

javascript - 如何使用 Javascript/Jquery 显示图像对象

javascript - AngularJS 中的代码可见性

angularjs - 需要oauth身份验证的e2e Protractor 测试

javascript - angularjs 指令 watch 未在对象函数属性上触发

javascript - Angularjs 根据属性过滤表格内容