5

私は、 Railscastを出発点として、Rails アプリに AngularJS を実装することに取り組んできました。私の質問は、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 に答える