AngularJS 应用程序:从 JSON 加载数据一次并在多个控制器中使用它

2024-02-15

我正在开发一个使用 AngularJS 作为框架的移动应用程序,目前我有一个与此类似的结构:

app.config(['$routeProvider', function($routeProvider) {
    $routeProvider
        .when('/', {
            templateUrl : 'pages/home.html',
            controller  : 'homeCtrl'
        })

        .when('/one', {
            templateUrl : 'pages/one.html',
            controller  : 'oneCtrl'
        })

        .when('/two', {
            templateUrl : 'pages/two.html',
            controller  : 'twoCtrl'
        });
}]);

app.controller('homeCtrl', ['$scope', function($scope) {

}]);

app.controller('oneCtrl', ['$scope', function($scope) {

}]);

app.controller('twoCtrl', ['$scope', function($scope) {

}]);

然后我用一个显示内容ng-view:

<div class="ng-view></div>

一切运行良好,但我需要从 JSON 文件加载数据以填充应用程序的所有内容。我想要的是进行 AJAX 调用只有一次然后通过我所有不同的控制器传递数据。在我的第一次尝试中,我想创建一个带有$http.get()并将其包含在每个控制器中,但它不起作用,因为每次我注入和使用该服务时它都会发出不同的 ajax 请求。由于我是新使用角度的,所以我想知道什么是最好的方法或更“角度的方法”来实现这一点而不搞乱它。

Edit:我正在添加服务的代码,这只是一个简单的$http.get要求:

app.service('Data', ['$http', function($http) {
    this.get = function() {
        $http.get('data.json')
        .success(function(result) {
            return result;
        })
    }
});

初始化 Promise 一次,并返回对其的引用:

无需初始化另一个承诺。 $http 返回 1。

只需钉一个.then()呼吁你承诺修改结果

angular.module('app', [])
  .service('service', function($http){
    this.promise = null;
    function makeRequest() {
         return $http.get('http://jsonplaceholder.typicode.com/posts/1')
             .then(function(resp){
                  return resp.data;
             });
    }
    this.getPromise = function(update){
      if (update || !this.promise) {
         this.promise = makeRequest();
      }
      return this.promise;      
    }
  })

Codepen 示例 http://codepen.io/danemacaulay/pen/PqjEqr?editors=101

编辑:您可以考虑使用 $http 缓存。它可以达到相同的结果。来自文档 https://docs.angularjs.org/api/ng/service/%24http#caching:

如果使用尚未填充的同一缓存发出多个相同的请求,则将向服务器发出一个请求,其余请求将返回相同的响应。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS 应用程序:从 JSON 加载数据一次并在多个控制器中使用它 的相关文章

随机推荐

  • 仅使用公式即可获取当前文化以进行本地化

    有没有办法使用 Excel 中的公式确定当前系统区域性不使用任何VBA代码 我想象这样简单的事情 IF CULTURE sk SK Preh ad Overview 或者类似的事情也适合我 IF CURRENCYSIGN Preh ad O
  • 仅备份 SQL 架构?

    我需要创建 SQL Server 2005 数据库的备份 该数据库只有结构 没有记录 只有架构 有什么办法可以做到这一点吗 编辑 我正在尝试创建一个备份文件以与旧进程一起使用 因此脚本无法满足我的目的 抱歉 使用 3 步流程 从工作数据库生
  • 通过网站从 PHP 服务器下载文件 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有物理文件 希望用户在我的网站上下载 这些文件位于 C xampp htdocs myfile uploads 我需要一个 PHP 脚本
  • 撤消 git Push 到 Assembla

    所以 今天我想做一件好事并重新排列我的存储库中的文件 致力于并推动我的Assembla存储库 由于我没有使用 git moving 命令 所有文件都丢失了历史记录 我意识到自己的错误 并希望摆脱不必要的改变 以便之后可以采取正确的行动 我尝
  • 将 Java-Pair-Rdd 转换为 Rdd

    我需要将 Java pair rdd 转换为 csv 所以我想将其转换为rdd 来解决我的问题 我想要的是改变我的rdd 从 Key Value Jack a b c to Key value Jack a Jack b Jack c 我认
  • 如何在ElasticSearch中不进行分析?

    我不想分析 ElasticSearch 字段中的一个字段 即 e 应逐字保存和比较 这些值将包含字母 数字 空格 破折号 斜杠以及可能的其他字符 如果我没有在该字段的映射中提供分析器 则默认情况下仍使用分词器将我的逐字字符串分解为单词块 我
  • 在 Ruby 中删除“@”符号及其后面的所有内容

    我正在开发一个应用程序 我需要将用户电子邮件地址中 符号之前的任何内容作为他 她的名字和姓氏传递 例如 如果用户有电子邮件地址 电子邮件受保护 cdn cgi l email protection 比当用户提交表单时我从电子邮件中删除 ex
  • Typescript - 导入 Express 不起作用

    我的应用程序中有这个 types express已安装依赖项 import express require express 它指向的是express并说this is an unexpected identifier当我运行我的服务器时 我
  • Memcached 守护进程是否可以在不终止进程的情况下释放未使用的内存?

    我相信您不能强制正在运行的 Memcached 实例取消分配内存 除非终止该 Memcached 实例 并释放它所持有的所有内存 有谁知道一份明确的文档 甚至是来自可靠来源的邮件列表或博客文章 可以证实或否认这种印象 据我了解 Memcac
  • Tkinter tkFileDialog 不存在[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 中的 Tkinter 显示打开的文件对话框 我发现的每个示例似乎都很容易使用 但它们都以以下行开头 import tkFileDialog 这行代码给我抛出了一个错误 说 No mo
  • MVC3 - 编译的 Razor 视图找不到 _ViewStart

    我在单独的类库中使用编译的 Razor 视图作为 MVC3 的一种插件系统 我遵循 Chris Van De Steed 的指南here http www chrisvandesteeg nl 2010 11 22 embedding pr
  • 如何使用 bin/www 为node.js heroku 部署编写Procfile?

    我正在尝试部署 Heroku 应用程序 我相信 procfile 可能是我的应用程序未部署的原因 我尝试了多种解决方案 包括 网络 节点 bin www 网络 npm 启动 我的应用程序无法运行可能还有另一个原因 但我想确保我的 Procf
  • 访问类中的值类似于 boost::any

    我正在做一个简单的boost any 类似用于教育目的的课程 但我不知道如何访问存储的值 我可以完美地设置该值 但是当我尝试访问 holder 类中的任何成员时 编译器只是抱怨在它派生的类中找不到该成员 我无法将成员声明为virtual因为
  • 使用 Unirest C# 将 http 响应正文转换为 JSON 格式

    我正在使用 mashape api https market mashape com montanaflynn dictionary https market mashape com montanaflynn dictionary 这是我的
  • Clojure 中函数的类型提示

    我正在尝试解决 Clojure 中的反射警告 该警告似乎是由于对作为普通 Java 对象的函数返回值缺乏类型推断而导致的 演示该问题的简单示例代码 set warn on reflection true defn foo Integer x
  • Ruby 如何处理字节/二进制?

    我正在尝试通过套接字发送一系列二进制字节 以满足我公司使用的特定标准 我公司中没有人以前使用过 Ruby 来实现这一点 但在其他语言中 他们一次发送一个字节的数据 通常使用某种 打包 方法 无论如何 我找不到动态创建二进制文件 或者根本无法
  • Flexslider 手动控件不起作用

    我已经使用 Flexslider 创建了一个滑块 并且尝试使用 manualControls 创建导航菜单 但链接不起作用 以下是 flexslider 和滑块 导航本身的代码 柔性滑块 滑块和
  • os.system 中的变量

    我在用os systemPython 中的方法在 Linux 中打开文件 但我不知道如何在 os system 命令内传递变量 a import os a 4 os system gedit a test txt 如何在命令中将变量作为整数
  • C++ 中的整数字节交换

    我正在为我的 C 课程做家庭作业 我正在研究的问题如下 编写一个函数 它接受一个无符号短整型 2 个字节 并交换字节 例如 如果交换后 x 258 00000001 00000010 则 x 将为 513 00000010 00000001
  • AngularJS 应用程序:从 JSON 加载数据一次并在多个控制器中使用它

    我正在开发一个使用 AngularJS 作为框架的移动应用程序 目前我有一个与此类似的结构 app config routeProvider function routeProvider routeProvider when templat