2015-11-07 3 views
0

Я новичок в JSON, а также в AngularJS. Я пытаюсь получить доступ к элементам данных в глубоко вложенном удаленном json-файле. Мне удастся отобразить все результаты JSON в моем представлении. Однако я не могу настроить таргетинг на элементы, находящиеся в массиве внутри JSON. Это от Yahoo Currency.AngularJS рендеринг из глубоко вложенного jsonp

Это мой контроллер и вид, что делает весь файл в формате JSON:

контроллер

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> 

Я пытался писать контроллер, как это:

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" 
       } 
      } 
      }, 
    ... 

Для чего это стоит, JSONP, кажется, возвращать какие-то XML выглядящих вещей, когда я добавляю в обратного вызова = JSON_CALLBACK к URL, например:

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? Я получаю набор данных, отображаемый в моем представлении (см. Выше), но все это в фанк-синтаксисе xml. Как перехватить 3 значения, которые мне нужны, от массива и рендеринга в <ul> ??

+1

Попробуйте использовать отладчик браузера или войдите, чтобы увидеть, если вы получите ответ правильно – Dvir

+0

@Dvir Благодарю. Контроллер, который сбрасывает весь XML-материал, не исключает никаких исключений. Когда я пытаюсь указать поле (выше), я получаю следующую ошибку: 'TypeError: Невозможно прочитать ресурсы ресурсов 'undefined at app.js: 9 at angular.js: 8950 at offferred.promise.then. wrappedCallback (angular.js: 6846) at angular.js: 6883 at Object. $ get.Scope. $ eval (angular.js: 8057) at Object. $ get.Scope. $ digest (angular.js: 7922) на объекте $ get.Scope $ применяется (angular.js:.. 8143) на проделанном (angular.js: 9170) на completeRequest (angular.js: 9333) на angular.js: 9261' –

+1

После проверьте, добавлены ли data.results console.log (data.results) – Dvir

ответ

1

Вы можете использовать оригинальный контроллер, у вас были проблемы только с точки зрения. Это будет работать, если вы заменить его на это один:

<!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> 

Вот это Plunker, используя ваш пример JSON: http://plnkr.co/edit/wzF5t9dTZt49n5eq9N1L?p=preview

+0

Спасибо, что работает отлично. Как я уже сказал, я новичок в Angular (я из Rails). Я пытался найти решение DRYer, максимально оптимизировав его в контроллере. Но эй это работает! –

+1

Привет, я стараюсь использовать JS-код для необходимого процесса и представления для доступа, но если вы хотите упростить доступ в представлении, я сделал небольшую модификацию, поэтому данные легко доступны из представления, это в этом plnkr: http://plnkr.co/edit/wLQEjbSL4wbhA1qDrhUP?p=preview –

Смежные вопросы