javascript - 从深度嵌套的 jsonp 进行 AngularJS 渲染

标签 javascript json angularjs jsonp

我是 JSON 和 AngularJS 的新手。我正在尝试访问深度嵌套的远程 json 文件中的数据元素。我可以设法在我的 View 中呈现整个 JSON 结果。但是,我似乎无法定位 JSON 深处数组中的元素。它来自雅虎货币。

这是我的 Controller 和 View ,它呈现整个 JSON 文件:

Controller

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

app.controller('DataCtrl', function ($scope, $http) {
    $http.jsonp('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%3D%22http%3A%2F%2Ffinance.yahoo.com%2Fwebservice%2Fv1%2Fsymbols%2Fallcurrencies%2Fquote%3Fformat%3Djson%22&format=jsonp&callback=JSON_CALLBACK').success(function (data) {

        $scope.data = data;
    });
});

查看

<!doctype html>
<html ng-app="app" >
<head>
  <meta charset="utf-8">
  <title>LIVE</title>
  <!-- <link rel="stylesheet" href="style.css"> -->
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js"></script>
  <script src="app.js"></script>
</head>
<body ng-controller="DataCtrl">
  <h1>Live from JSON feed</h1>
  <ul>
    <li ng-repeat="row in data">
      {{ data }}
    </li>
  </ul>
</body>
</html>

我尝试像这样编写 Controller :

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

app.controller('DataCtrl', function ($scope, $http) {
    $http.jsonp('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%3D%22http%3A%2F%2Ffinance.yahoo.com%2Fwebservice%2Fv1%2Fsymbols%2Fallcurrencies%2Fquote%3Fformat%3Djson%22&format=jsonp&callback=JSON_CALLBACK').success(function (data) {
            var pair = { name };
        // $scope.data = data;
        if(data) {
            if (data.results) {
                pair.name = data.results.list.resources[0].resource.fields.name;
            }
        }
    });
});

但这行不通。这是 JSON(部分)..我正在尝试访问每个资源的“名称”、“价格”和“utctimestamp”字段:

{
  "query": {
    "count": 1,
    "created": "2015-11-07T05:42:03Z",
    "lang": "en-US",
    "diagnostics": {
      "publiclyCallable": "true",
      "url": {
        "execution-start-time": "0",
        "execution-stop-time": "23",
        "execution-time": "23",
        "content": "http://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote?format=json"
      },
      "user-time": "25",
      "service-time": "23",
      "build-version": "0.2.311"
    },
    "results": {
      "list": {
        "meta": {
          "type": "resource-list",
          "start": "0",
          "count": "173"
        },
        "resources": [
          {
            "resource": {
              "classname": "Quote",
              "fields": {
                "name": "USD/KRW",
                "price": "1152.994995",
                "symbol": "KRW=X",
                "ts": "1446874620",
                "type": "currency",
                "utctime": "2015-11-07T05:37:00+0000",
                "volume": "0"
              }
            }
          },
          {
            "resource": {
              "classname": "Quote",
              "fields": {
                "name": "SILVER 1 OZ 999 NY",
                "price": "0.068046",
                "symbol": "XAG=X",
                "ts": "1446850711",
                "type": "currency",
                "utctime": "2015-11-06T22:58:31+0000",
                "volume": "100"
              }
            }
          },
          {
            "resource": {
              "classname": "Quote",
              "fields": {
                "name": "USD/VND",
                "price": "22364.000000",
                "symbol": "VND=X",
                "ts": "1446874620",
                "type": "currency",
                "utctime": "2015-11-07T05:37:00+0000",
                "volume": "0"
              }
            }
          },
    ...

就其值(value)而言,当我将 callback=JSON_CALLBACK 附加到网址时,jsonp 似乎会返回某种类似 xml 的内容,如下所示:

JSON_CALLBACK({"query":{"count":"1","created":"2015-11-07T16:08:29Z","lang":"en-US"},"results":["<list><meta><type>resource-list</type><start>0</start><count>173</count></meta><resources><resource><classname>Quote</classname><fields><name>USD/KRW</name><price>1152.994995</price><symbol>KRW=X</symbol><ts>1446900900</ts><type>currency</type><utctime>2015-11-07T12:55:00+0000</utctime><volume>0</volume></fields></resource></resources><resources><resource><classname>Quote</classname><fields><name>SILVER 1 OZ 999 NY</name><price>0.068046</price><symbol>XAG=X</symbol><ts>1446850711</ts><type>currency</type><utctime>2015-11-06T22:58:31+0000</utctime><volume>100</volume></fields></resource></resources><resources><resource>
...

我使用 JSONp 的方式有问题吗?我正在将数据集渲染到我的 View (上面),但它全部采用时髦的 xml 语法。如何从该数组中获取我需要的 3 个值并在 <ul> 中渲染??

最佳答案

您可以使用原来的 Controller ,只是 View 中有问题。如果你用这个替换它就会起作用:

<!doctype html>
<html ng-app="app" >
    <head>
        <meta charset="utf-8">
        <title>LIVE</title>
        <!-- <link rel="stylesheet" href="style.css"> -->
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js"></script>
        <script src="script.js"></script>
    </head>
    <body ng-controller="DataCtrl">
        <h1>Live from JSON feed</h1>
        <ul>
            <li ng-repeat="res in data.query.results.list.resources">
                {{ res.resource.fields.name }}: {{ res.resource.fields.price }}, {{ res.resource.fields.utctime }}
            </li>
        </ul>
    </body>
</html>

这是使用您的 JSON 示例的 Plunker:http://plnkr.co/edit/wzF5t9dTZt49n5eq9N1L?p=preview

关于javascript - 从深度嵌套的 jsonp 进行 AngularJS 渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33586281/

相关文章:

javascript - snap.svg 制作完美 "circle pointer"

javascript - 如何将线条和文本作为标签添加到 D3 中的矩形?

javascript - 如何在 Javascript 中将 JSON (OData) 时间转换为 gg-mm-aaaa 之类的内容?

javascript - 将递归 json 对象转换为另一个 json 对象

angularjs - Protractor :如何扩展 Protractor 库?

angularjs - 将ui.router中的$ state.go()的默认行为更改为默认情况下重新加载

javascript - 更改 Angular ui-bootstrap 模板的文件夹位置

javascript - Angular 引导日历

javascript - 如何在 Fabric.js 中将 Canvas 导出为 HTML?

javascript - 即使最大宽度设置为 100%,为什么我的 (json) 图像仍超出边框/容器?