【问题标题】:Angularjs: Number of HTTP requests when loading an HTML template?Angularjs:加载HTML模板时的HTTP请求数?
【发布时间】:2014-04-03 14:07:33
【问题描述】:

我刚开始学习 Angular,所以这可能是一个愚蠢的问题,或者我只是错过了一些东西。

说,我有一个主模板 index.html,我想在某个时间点插入一个部分模板(它是一个表格)。因此,我发出一个 HTTP 请求以使用 ajax 加载部分,然后我还发出另一个请求以获取 JSON 数据以填充表部分。 是这样的吗?

当您在服务器端处理它时,您会在响应之前获取数据并在模板中撒上变量。所以只有一个请求,客户端得到的部分已经填满了数据。

我是否遗漏了什么,或者就是这样,您需要两次访问服务器:一次获取数据,另一次获取模板?

谢谢

【问题讨论】:

  • 表格中填入的数据是否有任何参数??
  • 好吧,您至少需要从中加载数据的表名......目前,在我的简单测试应用程序中,我有三个路由:“getIndex”、“getTable”和“getJson”。最后一个获取 table partial 的数据。因此问题..

标签: angularjs


【解决方案1】:

是的,这就是它开箱即用的方式,但是有几种方法可以避免对模板执行额外的请求。 Angular 有一个template-cache,它会在发出请求之前尝试找到给定的模板。很常见的情况是,当打包 Angular 应用程序用于生产时,会生成一个脚本,将所有模板放入缓存中,然后在最小化所有内容后将该脚本附加到应用程序的其余部分。

有 grunt-plugins 可以为你做这件事(例如this one)。在我目前正在进行的项目中,我们坚持使用maven,所以我自己制作了。

另一种方法是将模板包含在您的 index.html 文件中(这在 $templateCache 的文档中与 <script type="text/ng-template" id="templateId.html"> 块一起显示。

【讨论】:

  • 谢谢。我想,这就是我的答案。稍后我会打勾......最初,当我意识到双程问题时,我认为这样做的方法是使用 JavaScript 生成部分并即时插入它们。在这种情况下,您只需进行数据旅行。
  • 我不会称之为“问题”。如果你让它在生产中像这样工作,这只是一个问题。对于本地开发来说,获取模板的额外请求并不重要。
  • 很公平.. 没问题。如果大量使用,只是有点性能问题。现在,一个相关的困惑是。数据请求实际是在什么时候提出的?说,我通过事件触发器加载部分 HTML,但填充模板的数据是通过放置在主控制器中的 Ajax 调用获取的当我第一次加载主页然后它只是坐在那里等待我实际加载模板时填充模板?或者...当我使用相关变量加载部分数据时,数据是否会同时获取?
  • 如果您将请求放入controller 的构造函数中,则将在初始化controller 后立即发出请求,在您的情况下,听起来就像如果应用程序附加到index.html,则您点击了该应用程序。模板本身只是从它的$scope 中获取变量,它并不关心这些变量来自哪里。
  • 如果你在进行某种延迟加载,你需要自己实现它,要么对某种事件做出反应,要么在需要时不附加controller。请注意,controllers 不是单例,因此如果您想要缓存,您很可能需要从 service 发出请求。
【解决方案2】:

如果它只是一张桌子,那么你可以这样做

在主模板 (index.html) 中创建该表并使用 ng-show 将其隐藏。当您需要使用来自服务器的数据显示表格时,从角度调用服务器到服务器并填充表格然后显示它。所以只需要一个服务器调用,即仅用于获取数据。

下面给出一个示例代码

Working Demo

主 html

<div ng-app="myApp">
<div ng-controller="PeopleCtrl">
    <p>    Click <a ng-click="loadPeople()">here</a> to load data.</p>
<table ng-show="visible">
    <tr>
        <th>Id</th>
        <th>First Name</th>
        <th>Last Name</th>
    </tr>
    <tr ng-repeat="person in people">
        <td>{{person.id}}</td>
        <td>{{person.firstName}}</td>
        <td>{{person.lastName}}</td>
    </tr>
</table>
</div>
</div>

脚本

var mockDataForThisTest = "json=" + encodeURI(JSON.stringify([
    {
    id: 1,
    firstName: "Peter",
    lastName: "Jhons"},
{
    id: 2,
    firstName: "David",
    lastName: "Bowie"}
]));


var app = angular.module('myApp', []);

function PeopleCtrl($scope, $http) {

    $scope.people = [];

    $scope.loadPeople = function() {
        var httpRequest = $http({
            method: 'POST',
            url: '/echo/json/',
            data: mockDataForThisTest

        }).success(function(data, status) {
            $scope.people = data;
            $scope.visible=true;
        });

    };
}

【讨论】:

  • 感谢您的回答。我知道诀窍。 +1,因为它可能对其他人有用。在一个非常简单的应用程序中,它可能无法正常工作。如果您将它们全部隐藏在主页中,则它会破坏部分内容。不过,我的问题更为笼统:在您需要从磁盘加载部分内容的情况下,您会为它支付额外的服务器访问费用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
相关资源
最近更新 更多