getJSON и угловая модель

0

Я застрял. Как-то я не могу заставить это работать. Я пытаюсь загрузить данные для веб-приложения из (по-прежнему локального) JSON файла. Раздел этого JSON содержит цвета и выглядит так:

{
  "colors" : {
    "1" : "yellow",
    "2" : "green",
    "3" : "red"
  },
  "stuff : {...}
}

У меня очень простой HTML файл с некоторыми заголовками. Сценарии загружаются в заголовок. Интересная часть выглядит так:

<ul  ng-controller="ColorController">
  <li ng-repeat="(key,value) in colors" value="{{key}}">
    {{key}}: {{value}}
  </li>
</ul>

Соответствующий Javascript:

var colors = {
    "1": "lyellow",
    "2": "lgreen",
    "3": "lred"
};

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

app.controller('ColorController', function($scope){

    $scope.colors = colors;

    $.getJSON('data.json')
        .then(function(res){
            $scope.colors = res.colors;
        });
})

Сначала я попытался использовать локальную версию цветов, поэтому переменные цвета. Это сработало и произвело желаемый результат. Я попытался переключиться на локальный JSON. console.log показал правильный синтаксический анализ. На консоли отладки цвета и res.colors выглядят одинаково. Но список на странице не обновляется.

Я бы предположил, что это что-то со временем, но я не уверен. Может ли кто-нибудь указать мне в правильном направлении?

  • 0
    Можете ли вы попробовать .done вместо вашего .then ?
  • 2
    используйте $http.get вместо jQuery ajax

2 ответа

1
Лучший ответ

jQuery getJSON выполняется вне цикла углового дайджеста, и поэтому представление не обновляется тогда, а then вашего вызова ajax. Если бы вы добавили строку с $scope.$apply() после назначения переменной $ scope, представление обновилось (см. Plunker: https://plnkr.co/edit/HLSYl0pI2AZ15qf5T5WM?p=preview)

Однако я рекомендую использовать угловой родной $http.get для получения JSON. См. Здесь plunker: https://plnkr.co/edit/F7e5ECYbl91mYhF3g848?p=preview

angular.module('test', [])
.controller('testCtrl', function($scope, $http) {
  $http.get('colors.json')
  .then(function(response) {
    $scope.colors = response.data['colors']
  })
})
  • 0
    Было бы целесообразно использовать .success вместо .then , потому что лично я столкнулся с некоторыми проблемами с .then
  • 0
    .then был объявлен устаревшим после нескольких сборок (см. stackoverflow.com/questions/35329384/… ) - с какими проблемами вы столкнулись с .then?
Показать ещё 1 комментарий
0

Попробуйте использовать $ timeout.

.then(function(res){
  $timeout(function (res) {
    // your code
  }, 0);
})

он заставит углы обновить $ scope.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню