FDD(逐个功能开发)适用于 MVC 框架,Angular 就是其中之一。
通常建议将 JS 文件(任何 JS 文件,而不仅仅是 Angular)存储在 app/assets/javascripts 中,以便 Rails 资产管道自动获取它们。除此之外,没有任何约定,将它们存储在对您有意义的任何结构中。
我说一般是因为如果您的 Angular 代码变大,最好将其从 app 文件夹中提取出来。然后,您必须配置资产管道以使用您的新结构。
对于小型项目,我喜欢将 Angular javascript 文件保存在 app/assets/javascripts/angular
app/assets/javascripts/angular
/controllers/
/directives/
/helpers/
/models/
/services/
apps.js
templates.js.erb
视图进入app/assets/templates。
我遇到的一个大障碍是让 Angular 视图与 Rails 的资产管道一起工作。在开发中你不会注意到任何东西,但是一旦你在生产中部署,并且资产管道启动,Angular 就再也找不到视图了。
为了使资产管道服务于 AngularJS 视图,我必须创建一个模板缓存。
// templates.js.erb
(function(){
'use strict';
// version 0.01
// increase this every-time you deploy to production
angular.module('templates', []).run(['$templateCache', function($templateCache) {
<%
environment.context_class.instance_eval { include ActionView::Helpers::JavaScriptHelper }
app_root = File.expand_path('../../../', __FILE__)
templates = File.join(app_root, %w{templates ** *.html})
Dir.glob(templates).each do |f|
key = f.gsub(%r(^#{app_root}/templates/), '')
html = File.read(f).squish
%>
$templateCache.put("<%= key %>", "<%= escape_javascript(html) %>");
<% end %>
}]);
}());
然后你必须在你的模块中注入templates
angular.module("myModule", ['templates']);