Я застрял. Как-то я не могу заставить это работать. Я пытаюсь загрузить данные для веб-приложения из (по-прежнему локального) 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 выглядят одинаково. Но список на странице не обновляется.
Я бы предположил, что это что-то со временем, но я не уверен. Может ли кто-нибудь указать мне в правильном направлении?
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']
})
})
.success
вместо .then
, потому что лично я столкнулся с некоторыми проблемами с .then
Попробуйте использовать $ timeout.
.then(function(res){
$timeout(function (res) {
// your code
}, 0);
})
он заставит углы обновить $ scope.
.done
вместо вашего.then
?$http.get
вместоjQuery
ajax