10

UsersControllerによってindex.html.erbを提供するこのRailsアプリがあります。そのページを処理するAngularコントローラーには、ユーザー向けの$resourceサービスがあります

CoffeeScript

.factory('User', ['$resource', ($resource) ->
  $resource 'api/users/:user_id/:action', {authenticity_token:app.csrf},
    query:
      method: 'GET'
      isArray: yes
    new:
      method: 'GET'
      params:
        user_id: 'new'
    update:
      method: 'PUT'
])

そして、コントローラーはフェッチします

window.app = angular.module("app", ['userServices'])
.config(["$routeProvider", ($routeProvider) ->
  $routeProvider
  .when "/users",
    templateUrl: "assets/templates/users/index.html"
    controller: UserCtrl
    
  .otherwise redirectTo: "/users"
])

# users Controllers
UserCtrl = ($scope, User) ->
  User.query (r) ->
    $scope.users = r
    # code..

これはかなり一般的なシナリオだと思いますが、このページだけでサーバーに複数回アクセスする必要があることは明らかです。$ resourceサービスで呼び出されたアクションから返されたデータであるため、Angularがブートストラップデータを使用する方法があるかどうか疑問に思いました。

ブートストラップデータ部分は、Gon ruby​​ gemを使用してGonというグローバル変数に割り当てることで、すでに処理しています。$ scope.users=gon.usersを簡単に実行できることはわかっています。ただし、これらのユーザーモデルでは、$ scope.users[0]。$save()のような優れた機能は得られません。

ありがとうございました!

4

2 に答える 2

11

結局のところ、それは本当に簡単です!

たとえば、すべての非角度モデルが変数_tasksにあり、角度$ resourceモデルタスクがあるとします。必要なのは、次のように_tasksをコンストラクター関数Taskに1つずつ渡すことだけです。

$scope.tasks = (new Task(task) for task in _tasks)

次に、各$ scope.tasksには、これらすべての$ update()、$ delete()メソッドが含まれます。

$scope.tasks[0].$update({due_at: new Date})
于 2012-11-20T21:25:26.180 に答える
1

User.queryからのラウンドトリップを避けたいですよね?もしそうなら、このようなものはどうですか

<html>
<script type='text/javascript>
  initialUsers = <%= User.someRubyMethod.to_json %>
<script>

次に、コントローラーの内部

 $scope.users = intitialUsers;
于 2012-11-20T02:34:05.860 に答える