Angularjs json响应未反映在视图中?
我调用一个返回JSON响应的webservice。我想使用ng repeat将这个json数据绑定到视图中。 我对两个屏幕使用相同的控制器 这是流的外观:Angularjs json响应未反映在视图中?,angularjs,angularjs-scope,ionic-framework,angularjs-ng-repeat,ng-repeat,Angularjs,Angularjs Scope,Ionic Framework,Angularjs Ng Repeat,Ng Repeat,我调用一个返回JSON响应的webservice。我想使用ng repeat将这个json数据绑定到视图中。 我对两个屏幕使用相同的控制器 这是流的外观: 我调用Web服务并获取json 我使用$state.go('screen2')移动到另一个屏幕 在这里,我尝试将json与html绑定 我的代码: angular.module('controller').controller('Ctrl1', function($scope, $state, $http) { $scope.myList
- 我调用Web服务并获取json
- 我使用$state.go('screen2')移动到另一个屏幕
- 在这里,我尝试将json与html绑定
angular.module('controller').controller('Ctrl1', function($scope, $state, $http) {
$scope.myList;
$scope.getUserList = function() {
$http({
method: 'GET',
url: someurl,
}).then(function(response) {
//success
if (response.data.status == "OK") {
$scope.myList = response.data.data;
$state.go('screen2');
}
}, function(response) {
alert('failed');
});
}
我的观点(屏幕2):
$scope.myList
的作用域为单个控制器。每个
$scope
成员都绑定到一个控制器,该控制器应该绑定到一个视图
我怀疑您正在为两个不同的视图共享同一控制器;也许是这样的:
$stateProvider
.state('home', {
url: '/home',
templateUrl: 'home.html',
controller: 'homeController',
})
.state('screen2', {
url: '/screen2',
templateUrl: 'screen2.html',
controller: 'homeController',
});
(function() {
'use strict';
angular
.module('app.services', [])
.factory('dataService', dataService);
dataService.$inject = ['$q', '$http'];
/* @ngInject */
function dataService($q, $http) {
var service = {
myList: [],
fetchData: fetchData
};
return (service);
function fetchData() {
// Do some sort of $http request and fill the list.
var deferred = $q.defer();
this.myList = [];
this.myList.push({name: 'AAA'});
this.myList.push({name: 'BBB'});
this.myList.push({name: 'CCC'});
deferred.resolve(this.myList);
return deferred.promise;
}
}
})();
angular.module('controller').controller('Ctrl1', function($scope, $state, dataService) {
$scope.myList = dataService.myList;
$scope.getUserList = function() {
dataService.getUserList()
.then(function(response) {
//success
if (response.data.status == "OK") {
// $scope.myList = response.data.data;
$state.go('screen2');
}
}, function(response) {
alert('failed');
});
}
});
那不是一件好事。对于视图,最好有一个控制器
无论如何,由于您想要共享数据,因此必须使用某种缓存。
你能做的就是使用服务
您可以创建如下内容:
$stateProvider
.state('home', {
url: '/home',
templateUrl: 'home.html',
controller: 'homeController',
})
.state('screen2', {
url: '/screen2',
templateUrl: 'screen2.html',
controller: 'homeController',
});
(function() {
'use strict';
angular
.module('app.services', [])
.factory('dataService', dataService);
dataService.$inject = ['$q', '$http'];
/* @ngInject */
function dataService($q, $http) {
var service = {
myList: [],
fetchData: fetchData
};
return (service);
function fetchData() {
// Do some sort of $http request and fill the list.
var deferred = $q.defer();
this.myList = [];
this.myList.push({name: 'AAA'});
this.myList.push({name: 'BBB'});
this.myList.push({name: 'CCC'});
deferred.resolve(this.myList);
return deferred.promise;
}
}
})();
angular.module('controller').controller('Ctrl1', function($scope, $state, dataService) {
$scope.myList = dataService.myList;
$scope.getUserList = function() {
dataService.getUserList()
.then(function(response) {
//success
if (response.data.status == "OK") {
// $scope.myList = response.data.data;
$state.go('screen2');
}
}, function(response) {
alert('failed');
});
}
});
此服务已获得一个集合myList
,当调用方法fetchData
时将填充该集合。我使用了一个承诺来模拟控制器中的$http请求
您的控制器应如下所示:
$stateProvider
.state('home', {
url: '/home',
templateUrl: 'home.html',
controller: 'homeController',
})
.state('screen2', {
url: '/screen2',
templateUrl: 'screen2.html',
controller: 'homeController',
});
(function() {
'use strict';
angular
.module('app.services', [])
.factory('dataService', dataService);
dataService.$inject = ['$q', '$http'];
/* @ngInject */
function dataService($q, $http) {
var service = {
myList: [],
fetchData: fetchData
};
return (service);
function fetchData() {
// Do some sort of $http request and fill the list.
var deferred = $q.defer();
this.myList = [];
this.myList.push({name: 'AAA'});
this.myList.push({name: 'BBB'});
this.myList.push({name: 'CCC'});
deferred.resolve(this.myList);
return deferred.promise;
}
}
})();
angular.module('controller').controller('Ctrl1', function($scope, $state, dataService) {
$scope.myList = dataService.myList;
$scope.getUserList = function() {
dataService.getUserList()
.then(function(response) {
//success
if (response.data.status == "OK") {
// $scope.myList = response.data.data;
$state.go('screen2');
}
}, function(response) {
alert('failed');
});
}
});
您需要注入服务dataService
并请求列表,以便在控制器范围内填充数组:
$scope.myList = dataService.myList;
在控制器中调用方法$scope.getUserList()
时,dataService将获取数据:
dataService.getUserList()
并填充内部列表,因此当您要进入不同的状态时,dataService将填充列表,并且范围将加载新数据:
$scope.myList = dataService.myList;
这是一个plunker,您可以在其中测试
PS:我已经将同一个控制器用于不同的状态/视图,但我不会这样做。Thx。因此,当我使用服务时,它起作用了。但当我不知道是什么导致了问题?我只是想知道一些基本原理。@JayeshJain:试着用一种简单的方式重现你的问题,我可以试着解释。干杯