Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用AngularJS检索Rails中的嵌套资源_Ruby On Rails_Angularjs - Fatal编程技术网

Ruby on rails 使用AngularJS检索Rails中的嵌套资源

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

我一直致力于将AngularJS作为一个起点实现到我的Rails应用程序中。我的问题与这个问题相似:,但我还没有找到解决问题的办法

目前,我有一个嵌套的资源,我通过一个局部视图将其显示在父资源的视图上。为了检索任务,我需要在查询中提供project_id,因此我有:

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泰伦