我正在创建一个angularjs
应用,我的app.js
如下:
var capValueRecruitApp = angular.module('capValueRecruitApp', ['ui.router']);
capValueRecruitApp.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('home', {
url: '/home',
templateUrl: 'views/home.html',
controller: 'offresController'
})
.state('offres', {
url: '/offres',
templateUrl: 'views/offres.html',
controller: 'offresController'
})
.state('offres.detail', {
url: '/offres/:id',
templateUrl: 'views/offres.detail.html',
controller: 'offresController'
});
$urlRouterProvider.otherwise('/home');
});
当我进入#/offres
时,我会在offres.html
页面中获得一个优惠列表,当我进入#/offres/5
以获取offres.detail.html
中的密钥5时,我想要{1}}。
capValueRecruitApp.controller('offresController', function($scope, offresFactory, $stateParams) {
console.log($stateParam.id);
offresFactory.getList().then(function(list) {
$scope.offres = list.data;
console.log($scope.offres);
}, function(msg) {
alert(msg);
});
});
但当我输入#/offres/5
时,应用程序会将我路由到/home
的默认路由。
我该如何解决?
我做了以下修改后发现:
.state('offres.detail', {
url: '/:id',
templateUrl: 'views/offres.detail.html',
controller: 'offresController',
resolve: {
offresDetail: ['offresFactory', '$stateProvider', function(offresFactory, $stateProvider) {
return offresFactory.getOffresDetail($stateProvider.id);
}]
}
})
并在控制器中:
capValueRecruitApp.controller('offresController', function($scope, offresFactory, offresDetail) {
offresFactory.getList().then(function(list) {
console.log(offresDetail.data);
$scope.offres = list.data;
console.log($scope.offres);
}, function(msg) {
alert(msg);
});
});
和我的工厂:
capValueRecruitApp.factory('offresFactory', function($http) {
var factory = {
getList: function() {
return $http.get('http://localhost:8080/offres')
.then(function(response) {
return response;
}, function(error) {
return 'There was an error getting data';
});
},
getOffresDetail: function(id) {
return $http.get('http://localhost:8080/offres/'+id)
.then(function(response) {
console.log(id);
return response;
}, function(error) {
return 'There was an error getting data';
});
}
};
return factory;
});
你可以看到我在工厂里有两个console.log来测试id
而另一个用来测试offresDetail.data
但是我看不到控制台中的任何消息而且视图没有&# 39; t注入,我都看不到一些错误信息。
答案 0 :(得分:1)
定义子状态时,它的url相对于父状态。所以在你的情况下你定义了这个状态:" / offres / offres / 5"。因此,只需将子状态的url更改为相对于父状态,如下所示:
.state('offres.detail', {
url: '/:id', // <-- change to this
templateUrl: 'views/offres.detail.html',
controller: 'offresController'
});
我还建议您解决状态控制器所需的数据。例如:
.state('offres.detail', {
url: '/:id',
templateUrl: 'views/offres.detail.html',
controller: 'offresController',
resolve: {
offresDetail: ['offresFactory', '$stateProvider', function(offresFactory, $stateProvider) {
return offresFactory.getOffresDetail($stateProvider.id);
}]
}
});
并且控制器中只传递已解析的数据:
capValueRecruitApp.controller('offresController', function($scope, offresDetail) {
$scope.offresDetail = offresDetail.data;
});
您应该在服务中处理错误消息。