【问题标题】:What kind of loading JSON to AngularJS is better?哪种加载 JSON 到 AngularJS 更好?
【发布时间】:2016-12-29 10:46:32
【问题描述】:

我是 Angular 的新手。我在 AngularJS 中有带有搜索引擎的 Web 应用程序。我在后端(PHP)中准备 JSON,然后在我的 Angular 应用程序中使用它。

我很好奇哪种加载 JSON 到 AngularJS 更好,为什么?

现在我在 Controller 中创建 JSON,然后在 <script> 标签中的视图中显示它:

<script>
var json = [json_variable]
</script>

我在 DOM 文档末尾附加到我的项目的 JS 文件,所以一切都很好。

在 AngularJS 中,我通过 fromJson 方法加载这个变量

$scope.hotels = angular.fromJson(json);

这个方法不对?如果是这样,为什么?然后我使用这个 JSON 在 ng-repeat 中显示项目。

我应该在后端使用自己的 URL 创建单独的控制器并在那里准备 JSON 吗?然后,在 AngularJS 中通过 AJAX 和 http 请求加载 JSON?

【问题讨论】:

  • 您也可以通过获取请求获取静态 .json 文件 .. 指向它 ..
  • 我想知道哪种方法更好,为什么?我没有静态 .json 文件。我用 PHP 生成它
  • 啊所以...使用 $http.get .. 或更好(对我来说)使用 angular-resource (ngResource) docs.angularjs.org/api/ngResource/service/$resource
  • 首先不是 Angular 方式。它从 Angular 世界之外获取数据。所以你的模型无法识别。

标签: javascript php jquery angularjs json


【解决方案1】:

因此,如果有的话,最正确的方法可能是在控制器中发出 http 请求,但是您正在尝试的方法有其优势,cmets 有点片面,所以让我给出另一个观点。

Http 请求
如果您通过 http 请求获取数据,则在加载窗口和数据请求完成之间会有一段时间。这将使视图增长,您需要处理加载。在时间问题上,额外的 http 数据请求会产生一些开销,但这并不明显。根据我的经验,这种方法最糟糕的部分是 SEO。据报道,谷歌应该能够处理 javascript (Source),但我有一些网站并非如此。
这种方法最好的论据是角度方式,它超级简单,几乎没有成本,甚至可以异步完成,给用户一种快速加载页面的感觉!

JSON 在视图中提供
让我首先从一些优点开始。首先,当视图被加载时,数据就准备好了,这也可以以更角度的方式实现,但就这一点而言,这是一个收获。另一个积极的事情是旅游数据库的优化。在某些情况下,您有一个连接到数据库的连接,当您准备好使用它时,可以使用它来获取 JSON 数据。如果数据的初始负载很重,例如 2-3 秒以上,我就遇到了谷歌爬虫没有“等待”数据的问题。一件好事/坏事是您的页面加载速度会变慢,它不会增长,数据对用户来说似乎是即时的。这一点是您的网站所针对的风格问题。 我偶尔使用它的另一个用例是将您的 CMS 内容节点放入您的角度。 Ex 进行非常快速的语言更改(非常苗条的用例)。 问题:这不是角度方式(当我这样说时,我的意思是,网络上没有太多帮助,而且你的代码会让外人感到困惑)而且更难。所以你不应该按照你的建议做:

<script>
   var json = [json_variable]
</script>

不要将其保存为全局变量,否则会出现一些时间问题。您无法确定脚本是否在控制器之前加载,以及控制器是否取决于您有时间问题的值。额外的你让自己依赖 jQuery 来加载脚本,你可以解决这个问题,但它需要大量的互联网搜索和额外的代码。 你可以使用 ngInit 来解决这个问题:

<div ng-init="controllersInitFunction(json)">
  ...
</div>

Angular 会理解对象,你可以控制时间。

我只是想说这并不像其他人所说的那样完全清楚。我自己使用 angular 方式,因为它更容易,并且引入新的开发人员不会让他太困惑,但这不是唯一的方式。

为文字墙感到遗憾。

【讨论】:

    【解决方案2】:

    第一个策略使全局变量'json'。

    它一直是内存,直到窗口关闭或明确删除。这是坏事。不要创建全局变量。它有意大利面条代码的主要部分。那里没有上下文。如果您更改某些“ng-model 值”,则视图不会更改。 virw 不知道。

    您应该在角度上下文中加载数据。

    $http.get('path/to/json')
      .then(function (res) {
          // do something is here
          // parse json or change model
       });
    

    如果您的服务器遵循 REST API,则 angular-resource 也是不错的方法。

    【讨论】:

    • 我将“var json”中的 json 保存为 $scope.hotels,以便模型了解所有更改。然后我不使用 var json,而是使用 $scope.hotels。关于内存的争论很重要,所以有理由使用 $http,感谢您提供的信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多