ruby-on-rails - 在 Rails 中使用 AngularJS 检索嵌套资源

标签 ruby-on-rails angularjs

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

目前我有一个嵌套资源,我通过部分显示在父资源的 View 上。我需要在查询中提供 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"})

我的问题是,如何在 View 中设置 '@project_id' 以便在我的示例的最后一行中可以在 Controller 中访问该值?我尝试使用 ng-init:
<div ng-controller="TaskCtrl" ng-init="project_id = <%= @project.id %>">

但是,一旦在我的 TaskCtrl Controller 中,'project_id' 是空白的,并且 '$scope.project_id' 也不起作用。任何帮助表示赞赏。

最佳答案

ng-init 在模板执行之前运行,而不是在 Controller 初始化之前运行。
如果只有模板知道 project_id,则创建一个共享服务(它可以是一个简单的值工厂),它保存项目 id 并将其注入(inject)您的 Controller 。
您可以从 TaskController 之前初始化的另一个 Controller 填充该服务

<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()... 
}

抱歉没有咖啡...

关于ruby-on-rails - 在 Rails 中使用 AngularJS 检索嵌套资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16939799/

相关文章:

javascript - Rails Action Cable 在消息发布后向下滚动

ruby-on-rails - Ruby 默认是线程安全的吗?

ruby-on-rails - 将类添加到 Rails 5 中的 bootstrap_form_for collection_select

ruby-on-rails - 重定向的 RSpec 测试返回 200

html - AngularJS ngClass 条件

html - 按钮上的 Angular ngHide 在它原来的位置留下空间

ruby-on-rails - Rspec 中的标签可以进行 AND 运算还是 OR 运算?

javascript - 在 AngularJS 中定义服务和工厂的正确方法

javascript - Angular2中的选择问题

javascript - AngularJS:如何使用 shift 和鼠标单击来选择多个复选框?