通过 ui-router 将对象传递给控制器
Pass object through ui-router to controller
我正在使用 angular/rails 创建用户个人资料页面。我已经使用 ui-router 设置了一个 StateProvider,就像这样,
$stateProvider
.state('friendprofile', {
url: '/{name}',
views: {
"friendProfile": {
templateUrl: '../assets/angular-app/templates/_friendProfile.html',
controller: 'friendProfileCtrl',
}
},
})
这是模板中的点击操作,
%a.profile{"ui-sref" => "friendprofile(user)"}
name: {{ user.name }}
请注意,我在这里传递 user
。
因此,当单击 link .profile
时,我会转到 url http://localhost:3000/#/Jan%20Jansen。所以一切正常。
在我的 friendProfileCtrl
中,我有一个调用服务的函数,
friendProfileService.loadProfile().then(function(response) {
$scope.user_profile = response.data;
console.log ($scope.user_profile)
})
调用此服务的,
app.factory('friendProfileService', ['$http', function($http) {
return {
loadProfile: function() {
return $http.get('/users/4.json');
}
};
}])
目前我有 return url users/4/.json
硬编码。我能以某种方式获取用户 ID 吗?还是我必须在 StateProvider 中解决它?
您可以在状态中添加用户的 id
参数,以便可以从 $stateParams
.
中轻松读取它
url: '/{id}/{name}', //assuming user object has `id` property which has unique id.
因此,在创建 ajax 时,您可以在创建 ajax.
之前直接从用户对象中获取用户 id
控制器
friendProfileService.loadProfile($stateParams.id).then(function(response) {
$scope.user_profile = response.data;
console.log ($scope.user_profile)
})
工厂
app.factory('friendProfileService', ['$http', '$stateParams', function($http) {
return {
loadProfile: function(id) {
return $http.get('/users/'+ id +'json');
}
};
}])
你说的对 - 你应该在控制器加载之前解决它:
$stateProvider
.state('friendprofile', {
url: '/{name}',
views: {
"friendProfile": {
templateUrl: '../assets/angular-app/templates/_friendProfile.html',
controller: 'friendProfileCtrl',
}
},
resolve: {
user: function($stateParams, friendProfileService) {
friendProfileService.loadProfile($stateParams.name);
}
}
})
然后在控制器中,您可以注入 user
变量,这不是一个承诺,但已经解析了数据:
app.controller('friendProfileCtrl', [
'$scope',
'user',
...
function($scope, user, ...) {
$scope.user_profile = user;
console.log($scope.user_profile)
}
]);
顺便说一下,ui-sref
的值应该是这样的:friendprofile({name: user})
并且不要忘记将输入参数添加到 loadProfile
函数。也许您最好将 {name}
参数重命名为 {id}
我正在使用 angular/rails 创建用户个人资料页面。我已经使用 ui-router 设置了一个 StateProvider,就像这样,
$stateProvider
.state('friendprofile', {
url: '/{name}',
views: {
"friendProfile": {
templateUrl: '../assets/angular-app/templates/_friendProfile.html',
controller: 'friendProfileCtrl',
}
},
})
这是模板中的点击操作,
%a.profile{"ui-sref" => "friendprofile(user)"}
name: {{ user.name }}
请注意,我在这里传递 user
。
因此,当单击 link .profile
时,我会转到 url http://localhost:3000/#/Jan%20Jansen。所以一切正常。
在我的 friendProfileCtrl
中,我有一个调用服务的函数,
friendProfileService.loadProfile().then(function(response) {
$scope.user_profile = response.data;
console.log ($scope.user_profile)
})
调用此服务的,
app.factory('friendProfileService', ['$http', function($http) {
return {
loadProfile: function() {
return $http.get('/users/4.json');
}
};
}])
目前我有 return url users/4/.json
硬编码。我能以某种方式获取用户 ID 吗?还是我必须在 StateProvider 中解决它?
您可以在状态中添加用户的 id
参数,以便可以从 $stateParams
.
url: '/{id}/{name}', //assuming user object has `id` property which has unique id.
因此,在创建 ajax 时,您可以在创建 ajax.
之前直接从用户对象中获取用户id
控制器
friendProfileService.loadProfile($stateParams.id).then(function(response) {
$scope.user_profile = response.data;
console.log ($scope.user_profile)
})
工厂
app.factory('friendProfileService', ['$http', '$stateParams', function($http) {
return {
loadProfile: function(id) {
return $http.get('/users/'+ id +'json');
}
};
}])
你说的对 - 你应该在控制器加载之前解决它:
$stateProvider
.state('friendprofile', {
url: '/{name}',
views: {
"friendProfile": {
templateUrl: '../assets/angular-app/templates/_friendProfile.html',
controller: 'friendProfileCtrl',
}
},
resolve: {
user: function($stateParams, friendProfileService) {
friendProfileService.loadProfile($stateParams.name);
}
}
})
然后在控制器中,您可以注入 user
变量,这不是一个承诺,但已经解析了数据:
app.controller('friendProfileCtrl', [
'$scope',
'user',
...
function($scope, user, ...) {
$scope.user_profile = user;
console.log($scope.user_profile)
}
]);
顺便说一下,ui-sref
的值应该是这样的:friendprofile({name: user})
并且不要忘记将输入参数添加到 loadProfile
函数。也许您最好将 {name}
参数重命名为 {id}