2013-06-05 70 views
5

我一直在努力將基於Railscast的AngularJS實現到我的Rails應用程序中作爲起點。我的問題類似於這個問題:Angular JS ngResource with nested resources,但我還沒有找到解決我的問題。使用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' 也不起作用。任何幫助表示讚賞。

回答

5

ng-init在模板執行之前運行,而不是在控制器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()... 
} 

抱歉,沒有咖啡之前初始化另一個控制器填補服務...

+0

感謝您的答覆,奧利弗。問題:如果正在通過ProjectID控制器訪問ng-init,爲什麼我不能將project_id跨度移動到任務控制器中?當然,我是angularjs的新手,但是如果值包含在Controller中,它們應該可以從範圍訪問。 – Drew

+1

當然,你可以做到這一點,但你仍然需要$監視project_id,因爲它沒有控制器init的值。但是如果你需要另一個控制器中的project_id,它是同級別的TaskCtrl,它不會看到project_id,只有孩子會。那是服務出現的地方。 – Oliver

+0

非常感謝您的幫助,但這對我來說並不是很有用...我使用坤寶來傳遞價值。在AngularJS中,從視圖中獲取正常字段值應該會更容易一些。 – Drew

0

雖然這並不通過AngularJS解決這個問題,我結束了剛好路過的值通過在gon寶石:

項目控制器:

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

咖啡js文件:

$scope.tasks = Task.query({project_id: gon.project_id}) 
+0

當我使用這種方法時,我得到了'gon is not defined'。有任何想法嗎? –