为什么 Angular 在使用 Rails 资产管道包含它时不起作用?
Why Angular doesn't work when including it using Rails asset pipeline?
我有一个名为 Factory 的 js 控制器:
(function() {
'use strict';
angular
.module('projectAlabama')
.controller('indexResourceListController', indexResourceListController);
indexResourceListController.$inject = ['resourceListFactory'];
function indexResourceListController(resourceListFactory) {
var vm = this;
resourceListFactory.query().$promise.then(function(data) {
vm.lists = data.splice(0, limit);
});
}
})();
2 种将 angular 包含到项目中的方法 - 不同的结果。
第一个:使用资产管道
宝石文件
source 'https://rails-assets.org'
gem 'rails-assets-angular'
gem 'rails-assets-ng-resource'
application.js
//= require angular
//= require ng-resource
//= require angular-route
//= require angular-rails-templates
//= require angular-material
//= require app
//= require_tree ./templates
//= require_tree ./controllers
//= require_tree ./factories
错误!
angular.self.js?body=1:13643 TypeError: Cannot read property 'then' of undefined
at new indexResourceListController
使用 CDN 的第二种方法:
layout.html.erb
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-resource.min.js"></script>
一切顺利。
谁能解释一下为什么?
将这个需要的代码拉到一个单独的文件中,然后在应用程序中需要这个文件。您也可以在浏览器中检查您的网络选项卡,看看 angular 是否在 ngresource 之后或之前加载。
我认为你必须在你的 gem 文件中做一些修改。
source 'https://rails-assets.org'
gem 'rails-assets-angular'
gem "rails-assets-angular-resource"
在你的 application.js
//= require angular-resource
并尝试删除 //= require_tree .
我认为现在应该可以了。
我强烈认为您可能遇到了一些版本控制问题,或者与资产排序相关的问题。我有 Angular Rails ,效果很好。唯一的区别是我使用 bower 来管理下载和安装我需要的资产。
{
"name": "MyApp",
"version": "0.0.1",
"description": "",
"dependencies": {
"angular": "1.5.0",
"angular-resource": "1.5.0",
"angular-route": "1.5.0",
"many-more" : "*"
},
"devDependencies": {},
"resolutions": {
"angular": "1.5.3"
}
}
Application.js
//= require jquery
//= require bootstrap
//= require angular
//= require angular-resource
//= require angular-route
//= require angular-rails-templates
//= require ng-app/app
//= require_tree ../templates
//= require_tree ../javascripts/ng-app
请注意 application.js 中的顺序非常重要。它会根据提到的顺序消化文件。
因为Angular需要一些技巧:
1) 尽可能避免使用 jQuery
2) Turbolinks 会引起冲突
3)如果你需要使用jquery,记得用jquery
包装兼容性
我有一个名为 Factory 的 js 控制器:
(function() {
'use strict';
angular
.module('projectAlabama')
.controller('indexResourceListController', indexResourceListController);
indexResourceListController.$inject = ['resourceListFactory'];
function indexResourceListController(resourceListFactory) {
var vm = this;
resourceListFactory.query().$promise.then(function(data) {
vm.lists = data.splice(0, limit);
});
}
})();
2 种将 angular 包含到项目中的方法 - 不同的结果。
第一个:使用资产管道
宝石文件
source 'https://rails-assets.org'
gem 'rails-assets-angular'
gem 'rails-assets-ng-resource'
application.js
//= require angular
//= require ng-resource
//= require angular-route
//= require angular-rails-templates
//= require angular-material
//= require app
//= require_tree ./templates
//= require_tree ./controllers
//= require_tree ./factories
错误!
angular.self.js?body=1:13643 TypeError: Cannot read property 'then' of undefined
at new indexResourceListController
使用 CDN 的第二种方法:
layout.html.erb
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-resource.min.js"></script>
一切顺利。
谁能解释一下为什么?
将这个需要的代码拉到一个单独的文件中,然后在应用程序中需要这个文件。您也可以在浏览器中检查您的网络选项卡,看看 angular 是否在 ngresource 之后或之前加载。
我认为你必须在你的 gem 文件中做一些修改。
source 'https://rails-assets.org'
gem 'rails-assets-angular'
gem "rails-assets-angular-resource"
在你的 application.js
//= require angular-resource
并尝试删除 //= require_tree .
我认为现在应该可以了。
我强烈认为您可能遇到了一些版本控制问题,或者与资产排序相关的问题。我有 Angular Rails ,效果很好。唯一的区别是我使用 bower 来管理下载和安装我需要的资产。
{
"name": "MyApp",
"version": "0.0.1",
"description": "",
"dependencies": {
"angular": "1.5.0",
"angular-resource": "1.5.0",
"angular-route": "1.5.0",
"many-more" : "*"
},
"devDependencies": {},
"resolutions": {
"angular": "1.5.3"
}
}
Application.js
//= require jquery
//= require bootstrap
//= require angular
//= require angular-resource
//= require angular-route
//= require angular-rails-templates
//= require ng-app/app
//= require_tree ../templates
//= require_tree ../javascripts/ng-app
请注意 application.js 中的顺序非常重要。它会根据提到的顺序消化文件。
因为Angular需要一些技巧:
1) 尽可能避免使用 jQuery 2) Turbolinks 会引起冲突 3)如果你需要使用jquery,记得用jquery
包装兼容性