Ruby on rails 使用AngularJS检索Rails中的嵌套资源
我一直致力于将AngularJS作为一个起点实现到我的Rails应用程序中。我的问题与这个问题相似:,但我还没有找到解决问题的办法 目前,我有一个嵌套的资源,我通过一个局部视图将其显示在父资源的视图上。为了检索任务,我需要在查询中提供project_id,因此我有:Ruby on rails 使用AngularJS检索Rails中的嵌套资源,ruby-on-rails,angularjs,Ruby On Rails,Angularjs,我一直致力于将AngularJS作为一个起点实现到我的Rails应用程序中。我的问题与这个问题相似:,但我还没有找到解决问题的办法 目前,我有一个嵌套的资源,我通过一个局部视图将其显示在父资源的视图上。为了检索任务,我需要在查询中提供project_id,因此我有: app.factory "Task", ["$resource", ($resource) -> $resource("/projects/:project_id/tasks/:id", {project_id: "@pr
app.factory "Task", ["$resource", ($resource) ->
$resource("/projects/:project_id/tasks/:id", {project_id: "@project_id", id: "@id"}, {update: {method: "PUT"}})
]
@TaskCtrl = ["$scope", "Task", ($scope, Task) ->
$scope.tasks = Task.query({project_id: "@project_id", id: "@id"})
我的问题是,如何在视图中设置“@project_id”,以便在我的示例的最后一行中,可以在控制器中访问该值?我尝试使用ng init:
<div ng-controller="TaskCtrl" ng-init="project_id = <%= @project.id %>">
但是,一旦在我的TaskCtrl控制器中,“project_id”为空,“$scope.project_id”也不起作用。非常感谢您的帮助。ng init在模板执行之前运行,而不是在控制器初始化之前运行。 如果只有模板知道项目id,那么创建一个共享服务(它可以是一个简单的值工厂),该服务保存项目id并将其注入控制器。 您可以从TaskController之前初始化的另一个控制器填充该服务
<div ng-controller="ProjectIDController">
<span ng-init="project_id = <%= @project.id %>"></span>
</div>
<div ng-controller="TaskCtrl">
...
</div>
function ProjectIDController( $scope, sharedService ) {
$scope.$watch('project_id', function (UID) {
sharedService.setProjectID($scope.project_id);
});
}
function TaskCtrl ($scope, Task, sharedService) {
$scope.tasks = Task.query({project_id: sharedService.getProjectId()...
}
...
函数ProjectdController($scope,sharedService){
$scope.$watch('project_id',函数(UID){
setProjectID($scope.project\u id);
});
}
函数TaskCtrl($scope、Task、sharedService){
$scope.tasks=Task.query({project\u id:sharedService.getProjectId()。。。
}
抱歉没有喝咖啡…虽然这不能通过AngularJS解决问题,但我最终只是通过gem传递了值: 项目控制员:
def show
gon.project_id = @project.id
.
.
end
$scope.tasks = Task.query({project_id: gon.project_id})
咖啡js文件:
def show
gon.project_id = @project.id
.
.
end
$scope.tasks = Task.query({project_id: gon.project_id})
gon不是一个好的解决方案
或者你可以试试谢谢你的回答,奥利弗。问题:如果Projectd Controller正在访问ng init,为什么我不能将项目id范围移动到任务控制器中?当然,我是angularjs的新手,但是看起来如果值包含在控制器中,它们应该可以从范围中访问。当然,你可以这样做,但你必须我必须$watch项目id,因为它在controller init上没有值。但是如果你需要另一个控制器中的项目id,TaskCtrl的兄弟,它不会看到项目id,只有孩子会看到。这就是服务出现的地方。谢谢你的帮助,但这对我来说不太管用…我使用gon gem来传递值。我在AngularJS中,从视图中获取正常字段值似乎要容易一些。我无法实现这一点,你能解释一下sharedService工厂是什么样子吗?我得到
gon在使用此方法时没有定义。有什么想法吗?为什么gon是一个糟糕的解决方案?在我看来,它打破了AngularJS的理念和单页pa泰伦