5 Stimmen

Verwenden Sie AngularJS, um die verschachtelte Ressource in Rails abzurufen

Ich habe daran gearbeitet, AngularJS in meine Rails-App zu implementieren, basierend auf dem Railscast als Ausgangspunkt. Meine Frage ist ähnlich zu dieser Frage: Angular JS ngResource mit verschachtelten Ressourcen, jedoch habe ich noch keine Lösung für mein Problem gefunden.

Aktuell habe ich eine verschachtelte Ressource, die ich auf der Ansicht der übergeordneten Ressource via einem Partial anzeigen lasse. Um die Aufgaben abzurufen, muss ich die project_id in der Abfrage angeben, deshalb habe ich folgendes:

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

Meine Frage ist, wie setze ich '@project_id' in der Ansicht, damit der Wert im Controller auf der letzten Zeile meines Beispiels zugänglich ist? Ich habe versucht ng-init zu verwenden:

Jedoch ist einmal im TaskCtrl-Controller 'project_id' leer und '$scope.project_id' funktioniert auch nicht. Jede Hilfe wird geschätzt.

5voto

Oliver Punkte 4461

Ng-init wird vor der Vorlagenausführung ausgeführt, nicht vor der Controller-Initialisierung. Wenn nur die Vorlage über die project_id informiert ist, erstellen Sie einen gemeinsamen Dienst (es kann sich um eine einfache Wertfabrik handeln), der die Projekt-ID enthält und injizieren Sie sie in Ihren Controller. Sie können diesen Dienst von einem anderen Controller aus füllen, der vor TaskController initialisiert wird.

    ...

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

Entschuldigung, kein Kaffee...

0voto

Drew Punkte 2561

Obwohl dies das Problem nicht über AngularJS löst, habe ich einfach den Wert über das gon Gem übergeben:

Projektcontroller:

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

Coffee JS-Datei:

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

0voto

Aray Karjauv Punkte 2343

Gon ist keine gute Lösung

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

oder du kannst dies versuchen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X