2015-06-05 5 views
0

Я тестирую сайт AngularJS локально. У меня возникают проблемы с анализом данных JSON с использованием $http.get из локального файла JSON.

Когда я определяю JSON в своем контроллере, у меня нет проблем. Однако, когда я получаю JSON из файла (data.json), формат JSON отличается, в соответствии с консолью JavaScript.

Каким образом форматы JSON отличаются? В частности, извлеченный $http.get JSON имеет цифровые клавиши. Могу ли я просто удалить цифровые клавиши? Или что-то не так с моей декларацией/синтаксисом JSON? Ниже приведена дополнительная информация.

Вот как я определяю его в мой контроллер:

$scope.customerReviews = [ 

     { 
      'id': '0', 
      'title': 'Outstanding Employee!', 
      'text': 'bar foo bar foo', 
      'image': '<img class="img-responsive img-hover" src="images/bob.jpg">', 
      'href': '', 
      'date': 'June 17, 2014', 
      'author': 'john', 
      'articleType': 'article', 
      'neverSettle': 'partnering', 
      'category': 'customerReviews' 
     }, 
     { 
      'id': '1', 
      'title': 'hooray!', 
      'text': 'congratulations', 
      'image': '<img class="img-responsive img-hover" src="images/bob.png">', 
      'href': '', 
      'date': 'June 17, 2014', 
      'author': 'sir charles', 
      'articleType': 'article', 
      'neverSettle': 'innovating', 
      'category': 'customerReviews' 
     }, 
     { 
      'id': '2', 
      'title': 'Outstanding Employee', 
      'text': 'bar foo foo', 
      'image': '<img class="img-responsive img-hover" src="images/bilbo.jpg">', 
      'href': '', 
      'date': 'June 17, 2014', 
      'author': 'johnny', 
      'articleType': 'article', 
      'neverSettle': 'engaging', 
      'category': 'customerReviews' 
     }, 
     { 
      'id': '3', 
      'title': 'Thank you', 
      'text': 'much thanks', 
      'image': '<img class="img-responsive img-hover" src="images/x.jpg">', 
      'href': '', 
      'date': 'June 17, 2014', 
      'author': 'The Graduate College', 
      'articleType': 'article', 
      'neverSettle': 'innovating', 
      'category': 'customerReviews' 
     } 
    ]; 

Когда я копирую пасту из [ в ]; в инструменты разработчика консоли Chrome, я получаю следующий результат:

better picture of controller-declared JSON console output

Как я уже говорил выше, мой текущий код отлично печатает мой контент. Но если я попытаюсь получить JSON во внешнем файле, используя $http.get, он не распечатает мой контент, а в консоли JavaScript показан другой формат JSON.

Вот мой $http.get код (в контроллере):

// http get json content 
    $scope.customerReviews = []; 
    $http.get("js/models/data.json").success(function(data){ 
     console.log("success!"); 
     $scope.customerReviews = data; 
     console.log($scope.customerReviews); 
     return $scope.customerReviews; 
    }); 

Вот data.json. Как вы можете видеть, этот JSON-файл отличается от того, как я определяю свой контроллер. В частности, " и ' переключаются на совместимость с JSON. Я запускал это через проверку подлинности JSON, и он отформатирован правильно. Кроме того, когда я копирую пасту в консоль, я получаю первый вывод консоли. Только когда я делаю $http.get Я получаю «цифровые клавиши», и мои функции печати не работают.

[ 
    { 
     "id ": "0 ", 
     "title ": "Outstanding Employee! ", 
     "text ": "too lazy to obfuscate all of my content", 
     "image ": "<img class='img-responsive img-hover' src='images/GladisTolsa.jpg'> ", 
     "href ": " ", 
     "date ": "June 17, 2014 ", 
     "author ": "Martha Castleberry ", 
     "articleType ": "article ", 
     "neverSettle ": "partnering ", 
     "category ": "customerReviews " 
    }, 
    { 
     "id ": "1 ", 
     "title ": "Facilities Help ", 
     "text ": "too lazy to obfuscate all of my content", 
     "image ": "<img class='img-responsive img-hover' src='images/FernandoLopez.png'> ", 
     "href ": " ", 
     "date ": "June 17, 2014 ", 
     "author ": "Lucy Valenzuela ", 
     "articleType ": "article ", 
     "neverSettle ": "innovating ", 
     "category ": "customerReviews " 
    }, 
    { 
     "id ": "2 ", 
     "title ": "Outstanding Employee ", 
     "text ": "too lazy to obfuscate all of my content", 
     "image ": "<img class='img-responsive img-hover' src='images/MariaAlvarado.jpg'> ", 
     "href ": " ", 
     "date ": "June 17, 2014 ", 
     "author ": "Martha Castleberry ", 
     "articleType ": "article ", 
     "neverSettle ": "engaging ", 
     "category ": "customerReviews " 
    }, 
    { 
     "id ": "3 ", 
     "title ": "Thank you ", 
     "text ": "too lazy to obfuscate all of my content", 
     "image ": "<img class='img-responsive img-hover' src='images/MovingServices.jpg'> ", 
     "href ": " ", 
     "date ": "June 17, 2014 ", 
     "author ": "The Graduate College ", 
     "articleType ": "article ", 
     "neverSettle ": "innovating ", 
     "category ": "customerReviews " 
    } 

]

Так $http.get запрос работает. Вот вывод на консоль:

http.get console output

Уф. Прошу прощения за долготу моего вопроса.

Мой вопрос: Почему кажущиеся эквивалентными JSON выводятся различные форматы? В частности, почему у получателя $http.get JSON (второй) есть цифровые клавиши? Мне нужен второй вывод консоли, чтобы иметь тот же вывод, что и первый вывод консоли. Могу ли я просто удалить цифровые клавиши? Или что-то не так с моей декларацией/синтаксисом JSON?

Любой ввод оценивается. Особенно все, что могло бы улучшить мои навыки AngularJS и знания JSON. Заранее спасибо.

EDIT: Спасибо всем до сих пор. По-видимому, это индексы массивов, написанные инструментами разработчика Chrome, а не числовые ключи. Я не буду менять свой пост, чтобы избежать путаницы для других.По желанию, вот как работает моя печать:

<!-- ng repeat of Blog Preview Rows (reversed) --> 
    <div ng-repeat="x in getCategory().slice().reverse() | limitTo:quantity " close="getCategory().splice(index, 1)"> 
     <previews></previews> 
     <hr /> 
    </div> 

getCategory() это функция, которая получает строку запроса в URL с помощью регулярных выражений. Как указано выше, это работает, когда JSON объявляется в контроллере. Возможно getCategory() побежал после$http.get, поэтому не печатать ничего? Также обратите внимание, что я просто изменяю ng-repeat.

Вот <preview> директива:

.directive('previews', function() { 
    return { 
     restrict: 'AEC', 
     replace: 'true', 
     templateUrl: 'js/views/articleCollection.htm' 
    }; 
}); 

articleCollection.htm:

<div class="row"> 

<div class="col-md-1 text-center"> 
     <p><span ng-bind-html="x.articleType"></span></p> 
     <p><span ng-bind-html="x.neverSettle"></span></p> 
    <p><span ng-bind-html="x.date"></span></p> 
</div> 
<div class="col-md-5"> 
    <a href="{{ x.href }}"> 
     <span ng-bind-html="x.image"></span> 
    </a> 
</div> 
<div class="col-md-6"> 
    <h3> 
     <a href="{{ x.href }}"><span ng-bind-html="x.title"></span></a> 
    </h3> 
    <p> 
     by <span ng-bind-html="x.author"></span> 
    </p> 
    <p><span ng-bind-html="x.text"></span></p> 
    <a class="btn btn-default" href="{{ x.href }}">Read More <i class="fa fa-angle-right"></i></a> 
</div> 
</div> 

Еще раз спасибо. Дайте мне знать, как я могу уточнить свой вопрос. Также дайте мне знать, как я могу улучшить что-то связанное с AngularJS. До сих пор путешествие было doozy.

+0

Что числовые ключи? Единственные числовые ключи, которые я вижу, - это индекс массива, который является лишь частью представления инструментов разработчиков массива. Результат кажется абсолютно таким же. – dcardoso

+0

Кажется, что мне тоже. –

+0

Я вижу, поэтому это не цифровые клавиши, а массивные индексы. Вывод выглядит точно так же, но мои существующие функции печати (которые используют ng-repeat) не работают со вторым. Нужно ли делать (без) массивные индексы с этим? – chakeda

ответ

0

Наконец-то получил сайт на веб-сервере, и тот же код забросил sce unsafe ошибок.

Я просто должен был доверять ему, как HTML, прежде чем вернуться!

HTML-trustifying вспомогательная функция:

function arrayToHTML(data) { 
     for (i = 0; i < data.length; i++) { 
      data[i]["id"] = $sce.trustAsHtml(data[i]["id"]); 
      data[i]["title"] = $sce.trustAsHtml(data[i]["title"]); 
      data[i]["text"] = $sce.trustAsHtml(data[i]["text"]); 
      data[i]["image"] = $sce.trustAsHtml(data[i]["image"]); 
      data[i]["date"] = $sce.trustAsHtml(data[i]["date"]); 
      data[i]["author"] = $sce.trustAsHtml(data[i]["author"]); 
      data[i]["articleType"] = $sce.trustAsHtml(data[i]["articleType"]); 
      data[i]["neverSettle"] = $sce.trustAsHtml(data[i]["neverSettle"]); 
      data[i]["category"] = $sce.trustAsHtml(data[i]["category"]); 
      data[i]["href"] = $sce.trustAsHtml(data[i]["href"]); 
     } 
    } 

Рабочий код:

// http get json content 
$scope.customerReviews = []; 
$http.get("js/models/data.json").success(function(data){ 
    console.log("success!"); 
    $scope.customerReviews = data; 
    console.log($scope.customerReviews); 
    arrayToHTML($scope.customerReviews); // This fixed it! 
    return $scope.customerReviews; 
}); 
1

В: Каким образом кажущиеся эквивалентными JSON выводятся различные форматы?

A: Потому что они действительны в любом случае. Дополнительная информация о синтаксисе JSON here

В: В частности, почему у получаемого $ http.get JSON (второго) есть цифровые клавиши?

A: Я предполагаю, что вы говорите об индексе позиции массива в каждом массиве объектов. Они упрощают распознавание массива. Конечно, для просмотра цели в консоли.

Вопрос: Мне нужен второй вывод консоли, имеющий тот же выход, что и первый выход на консоль. Могу ли я просто удалить цифровые клавиши?

A: То же, что и выше. Google chrome выводит «числовые ключи» именно для таких разработчиков, как мы, чтобы легко распознать позицию массива объекта. Вы не нуждаетесь в этом .json-файле.

В: Или что-то не так с моей декларацией/синтаксисом JSON?

A: Нет. Согласно приведенным вами примерам, вы все прекрасно. Продолжайте хорошую работу!

EDIT

Я сделал некоторые исследования, и, ahhhhhh я вижу вашу проблему сейчас.

Очевидно, что чтение JSON вызывает локальную проблему, поэтому вам нужно немного изменить.

Смотреть это:

AngularJS: factory $http.get JSON file

EDIT 2

Позвольте мне дать ему еще один шанс.

У меня лично есть проблемы с использованием $ scope, тем более что я бы не рекомендовал возвращать $ scope в функции.

Попробуйте это:

app.factory("factoryExample", ['$http', function ($http) { 
    return { 
     Main: $http.get("js/models/data.json") 
    } 
}]); 

//in controller 
app.controller('MainController', ['$scope', 'factoryExample', function ($scope, factoryExample) { 
    factoryExample.Main.success(function(data){ 
     $scope.customerReviews = data; 
    }); 
}]); 

Как ваш пост упоминается, что кажется, что вы можете получить JSON локально правильно, мое плохое. После этого кода ваш $ scope.customerReview должен работать!

EDIT3

Дайте JSon имя, для примера:

{ "foo": 
    [ 
     { 
      "id ": "0 ", 
      "title ": "Outstanding Employee! ", 
      "text ": "too lazy to obfuscate all of my content", 
      "image ": "<img class='img-responsive img-hover' src='images/GladisTolsa.jpg'> ", 
      "href ": " ", 
      "date ": "June 17, 2014 ", 
      "author ": "Martha Castleberry ", 
      "articleType ": "article ", 
      "neverSettle ": "partnering ", 
      "category ": "customerReviews " 
     }, 
     { 
      "id ": "1 ", 
      "title ": "Facilities Help ", 
      "text ": "too lazy to obfuscate all of my content", 
      "image ": "<img class='img-responsive img-hover' src='images/FernandoLopez.png'> ", 
      "href ": " ", 
      "date ": "June 17, 2014 ", 
      "author ": "Lucy Valenzuela ", 
      "articleType ": "article ", 
      "neverSettle ": "innovating ", 
      "category ": "customerReviews " 
     }, 
     { 
      "id ": "2 ", 
      "title ": "Outstanding Employee ", 
      "text ": "too lazy to obfuscate all of my content", 
      "image ": "<img class='img-responsive img-hover' src='images/MariaAlvarado.jpg'> ", 
      "href ": " ", 
      "date ": "June 17, 2014 ", 
      "author ": "Martha Castleberry ", 
      "articleType ": "article ", 
      "neverSettle ": "engaging ", 
      "category ": "customerReviews " 
     }, 
     { 
      "id ": "3 ", 
      "title ": "Thank you ", 
      "text ": "too lazy to obfuscate all of my content", 
      "image ": "<img class='img-responsive img-hover' src='images/MovingServices.jpg'> ", 
      "href ": " ", 
      "date ": "June 17, 2014 ", 
      "author ": "The Graduate College ", 
      "articleType ": "article ", 
      "neverSettle ": "innovating ", 
      "category ": "customerReviews " 
     } 

    ] 
} 

Затем используйте:

<div ng-repeat="items in customerReviews.foo">{{items.id}}</div> 

и так далее.

+0

Благодарим вас за пояснения. Мой главный вопрос: почему мои функции печати работают с первым JSON , но не второй JSON, если они оба действительны? Ответ на этот вопрос разрешит мой пост. – chakeda

+0

Можете ли вы показать нам код, в котором вы печатаете их в своем HTML? –

+0

См. мой обновленный пост, если он может решить вашу проблему. –

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