5

我一直致力于在我的 Rails 应用程序中实现 AngularJS,基于Railscast作为起点。我的问题类似于这个问题:Angular JS ngResource with nested resources,但是我还没有找到解决我的问题的方法。

目前我有一个嵌套资源,我通过部分显示在父资源的视图上。我需要在查询中提供 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' 也不起作用。任何帮助表示赞赏。

4

3 回答 3

5

ng-init 在模板执行之前运行,而不是在控制器初始化之前运行。如果只有模板知道 project_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()... 
}

抱歉没有咖啡...

于 2013-06-05T13:06:32.700 回答
0

虽然这不能通过 AngularJS 解决问题,但我最终只是通过gon gem 传入了值:

项目负责人:

  def show
    gon.project_id = @project.id
    .
    .
  end

咖啡js文件:

$scope.tasks = Task.query({project_id: gon.project_id})
于 2013-06-05T14:33:17.330 回答
0

gon 不是一个好的解决方案

http://docs.angularjs.org/api/ng.directive:ngInit

或者你可以试试这个

于 2013-08-02T02:49:17.250 回答