2013-06-05 9 views
5

Pracuję nad implementacją AngularJS w mojej aplikacji Railsowej na podstawie Railscast jako punktu wyjścia. Moje pytanie jest podobne do tego pytania: Angular JS ngResource with nested resources, jednak nie znalazłem rozwiązania mojego problemu.Użyj AngularJS, aby pobrać zagnieżdżony zasób w Railsach

Obecnie mam zagnieżdżony zasób, który wyświetlam w widoku zasobu nadrzędnego, przez częściowe. Muszę dostarczyć PROJECT_ID w zapytaniu w celu pobrania zadania, więc mam:

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"}) 

Moje pytanie brzmi, jak mogę ustawić „@project_id” w widoku tak, że w ostatnim wierszu w moim przykład wartość jest dostępna w kontrolerze? Próbowałem za pomocą NG-Init:

<div ng-controller="TaskCtrl" ng-init="project_id = <%= @project.id %>"> 

Jednak raz w moim kontrolera TaskCtrl 'PROJECT_ID' jest puste, a '$ scope.project_id' nie działa. Każda pomoc jest doceniana.

Odpowiedz

5

ng-init działa przed wykonaniem szablonu, a nie przed inicjalizacją sterownika. Jeśli tylko szablon jest świadomy identyfikatora projektu, utwórz usługę udostępnioną (może to być prosta fabryka wartości), która przechowuje identyfikator projektu i wprowadza go do kontrolera. Można wypełnić tę usługę z innego kontrolera inicjalizacji przed 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()... 
} 

żal nie kawy ...

+0

Dzięki za odpowiedzi, Oliver. Pytanie: Jeśli dostęp do ng-init jest uzyskiwany przez ProjectID Controller, dlaczego nie mogę przenieść zakresu project_id do Task Controller? To prawda, że ​​jestem nowy w angularjs, ale wydaje się, że jeśli wartości są zawarte w kontrolerze, powinny być dostępne z zakresu. – Drew

+1

Oczywiście, możesz to zrobić, ale nadal musisz $ obserwować project_id, ponieważ nie ma on wartości na init kontrolera. Ale jeśli potrzebujesz project_id w innym kontrolerze, rodzeństwo dla TaskCtrl, to nie zobaczy project_id, tylko dzieci będą. Właśnie tam pojawiła się usługa. – Oliver

+0

Dzięki za twoją pomoc, ale to nie działało dla mnie ... Użyłem klejnotu gon, aby przekazać wartość. Wygląda na to, że uzyskanie normalnych wartości pól z widoku powinno być nieco łatwiejsze w AngularJS. – Drew

0

Mimo to nie rozwiąże problemu poprzez angularjs, skończyło się tylko przejazdem w wartości poprzez gon gem: kontroler

projekty:

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

kawa plik js:

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

Otrzymuję 'gon is not defined' przy użyciu tej metody. Jakieś pomysły? –

Powiązane problemy