1

我一直在使用 rails 并且开始摆弄集成 Angular.js。为了让自己继续前进,我正在制作一个简单的(你猜对了)待办事项应用程序。

在我的 Rails 控制器中,我做了一个简单的操作来在“完成”和“未完成”状态之间切换任务 - 可/tasks/:ID/complete作为PUT请求提供。

def complete
    @task = Task.find(params[:id])
    @task.toggle!(:complete)
    respond_with @task
end

我的视图列出了所有任务,并在链接旁边显示它们的名称,单击该链接时,我想为该任务调用“完成”操作。

<ul>
  <li ng-repeat="task in tasks">
    <a href="javascript:;" ng-click="completeTask(task.id)" class="complete-{{task.complete}}"></a>
    {{task.name}}
  </li>
</ul>

最后,在我的 js 控制器(咖啡脚本)中:

app = angular.module("TaskList", ["ngResource"])

@ListCtrl = ($scope, $resource) ->
  Task = $resource("/tasks/:id", {id: "@id"}, {
    update: {method: "PUT"}
    complete: {method: "PUT"}
  })
  $scope.tasks = Task.query()

  $scope.completeTask = (task_id) ->
    Task.complete(task_id)

我不确定“this”是否是 Angular 中的可用选项,但我在文档方面遇到了一些问题。当我掌握最佳实践时,有人能指出我正确的方向吗?

谢谢!

4

2 回答 2

2

所以我一直在摆弄 angular+rails 并阅读大量文档。我想我会分享一些我在这里找到的东西,这些东西可以帮助你并回答一些问题。

我应该如何构建我的应用程序?

很多关于 rails 和 angular 的文档将整个 angular 结构集成到您的 rails 应用程序中,就像在这个 angular rails 脚手架插件https://github.com/patcito/angularjs_scaffold中一样。我认为这是将 angular 插入应用程序的一种非常突兀的方式,感觉就像我正在远离让 rails 令人惊叹的东西,这就是它将数据集成到视图中的方式。

如何在导轨中平滑简单地实现角度

然后我偶然发现了接下来的两个惊人的资源。一直值得信赖的 Ryan Bates :)、http: //railscasts.com/episodes/405-angularjs?view=comments 和这个令人惊叹的 youtube 视频http://www.youtube.com/watch?v=UjYIVwGbNC4讨论了集成导轨和角。这些是我能找到的两个最合法的资源,以我希望它集成的格式集成 angular。

这似乎是我向你抛出的很多信息,但在我消化了所有这些信息后,我开始了解我将如何整合 angular 和 rails。Angular 为您提供了很多关于如何实现事物的选项,因此学习如何选择集成它取决于您自己。所以现在让我们回到你的问题。

根据您正在做的事情,您应该将所有逻辑放入角度控制器中的完整操作中。至少如果您尝试以 AJAXy 方式保存数据。这就是我会做的事情,我认为你想做的事情,

任务控制器.rb

class TasksController < ApplicationController
  respond_to :json

  def index
    @tasks = Task.all
  end

  def update
    @task.find(params[:id])
    respond_with @task.update_attributes(params[:task])
  end
end

tasks.js.coffee

app = angular.module("TaskList", ["ngResource"])

#I created a factory of your task to abstract it a little

app.factory 'Task', ($resource) ->
  $resource('/tasks/:id', {id: '@id'}, 
    {update: {method: 'PUT'}})

@ListCtrl = ($scope, $resource) ->
  $scope.tasks = Task.query()

  $scope.completeTask = () ->
    Task.save($scope.task)

视图/任务/index.html.erb

<ul>
  <li ng-repeat="task in tasks">
    <input type="checkbox"
    <!-- This puts it in checked mode if the task is complete when the page is loaded -->
    ng-checked="task.complete"
    <!-- use this to utilize two-way-data-binding. -->
    ng-model="task.complete"
>
    <a ng-click="completeTask()" ng-class="completed:{{task.complete}}">
      {{task.name}}
    </a>
  </li>
</ul>

我对导轨的角度比较陌生,但我认为这应该可行。应该注意的是,您可能还有 5 种其他可接受的解决方案可以用 angular 来解决。我发现 Angular 提供了许多可以以不同方式实现的工具,因此您需要找出解决问题的最佳格式。祝你好运!

于 2013-09-09T16:24:07.467 回答
0
<ul>
  <li ng-repeat="task in tasks">
    <a ng-click="completeTask(task.id)" class="complete-{{task.complete}}"></a>
{{task.name}}
  </li>
</ul>

您将需要一些东西来识别您正在更新的任务。

于 2013-05-01T00:33:47.387 回答