2013-06-05 34 views
5

Tôi đã làm việc để triển khai AngularJS vào ứng dụng Rails của tôi dựa trên Railscast làm điểm khởi đầu. Câu hỏi của tôi là tương tự như câu hỏi này: Angular JS ngResource with nested resources, tuy nhiên tôi đã không tìm thấy một giải pháp cho vấn đề của tôi.Sử dụng AngularJS để truy xuất tài nguyên lồng nhau trong Rails

Hiện tại tôi có tài nguyên lồng nhau mà tôi đang hiển thị trên chế độ xem của tài nguyên chính, qua một phần. Tôi cần phải cung cấp các PROJECT_ID trong truy vấn để lấy các nhiệm vụ, vì vậy tôi có:

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

Câu hỏi của tôi là, làm thế nào để tôi đặt '@project_id' trong giao diện để vào dòng cuối cùng trong tôi ví dụ giá trị có thể truy cập trong bộ điều khiển? Tôi đã thử sử dụng ng-init:

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

Tuy nhiên, một lần trong bộ điều khiển TaskCtrl 'project_id' trống và '$ scope.project_id' không hoạt động. Bất kỳ trợ giúp được đánh giá cao.

Trả lời

5

ng-init chạy trước khi thực thi mẫu, không phải trước bộ điều khiển init. Nếu chỉ mẫu nhận biết project_id, hãy tạo một dịch vụ dùng chung (nó có thể là một nhà máy có giá trị đơn giản) chứa id dự án và đưa nó vào bộ điều khiển của bạn. Bạn có thể điền dịch vụ đó khỏi một bộ điều khiển khởi tạo trước khi 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()... 
} 

xin lỗi vì không còn cà phê ...

+0

Cảm ơn đã phản ứng, Oliver. Câu hỏi: Nếu ng-init đang được AccessID Controller truy cập, tại sao tôi không thể di chuyển span project_id sang Task Controller? Cấp tôi mới vào angularjs, nhưng nó có vẻ như nếu giá trị được bao gồm trong Controller họ nên có thể truy cập từ phạm vi. – Drew

+1

Chắc chắn, bạn có thể làm điều đó, nhưng bạn vẫn phải $ xem project_id, vì nó không có giá trị trên bộ điều khiển init. Nhưng nếu bạn cần project_id trong bộ điều khiển khác, anh chị em cho TaskCtrl, nó sẽ không thấy project_id, chỉ có trẻ em sẽ. Đó là nơi dịch vụ xuất hiện. – Oliver

+0

Cảm ơn tất cả sự giúp đỡ của bạn nhưng điều này đã không được khá làm việc cho tôi ... Tôi đã sử dụng đá quý gon để vượt qua trong giá trị. Có vẻ như việc mua các giá trị trường bình thường từ khung nhìn sẽ dễ dàng hơn một chút trong AngularJS. – Drew

0

Trong khi điều này không giải quyết vấn đề thông qua AngularJS, tôi đã kết thúc chỉ đi trong giá trị thông qua các gon đá quý:

dự án điều khiển:

def show 
    gon.project_id = @project.id 
    . 
    . 
    end 
tập tin js 10

cà phê:

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

Tôi nhận được 'gon không được định nghĩa' khi sử dụng phương pháp này. Bất kỳ ý tưởng? –

Các vấn đề liên quan