【发布时间】:2016-04-08 22:12:24
【问题描述】:
我在我的应用中使用 requireJs。我面临一个场景,我想清除它。 我正在根据位置 url 或 routes 加载特定模板(视图)及其依赖的 js 文件。请参阅以下代码示例。
routes: {
'/': {
templateUrl: 'views/login.html',
dependencies: [
'scripts/controllers/login.js',
]
},
'/abc-view': {
templateUrl: 'views/abc.html',
requireLogin: true,
dependencies: [
'scripts/controllers/abc.js',
'scripts/controllers/xyz.js',
]
},
'/xyz-view': {
templateUrl: 'views/xyz.html',
requireLogin: true,
dependencies: [
'scripts/controllers/xyz',
}
}
当我更改为 xyz 视图时,将加载 xyz.js 文件。我的问题是,当我更改为 abc 视图时,是否会加载 xyz.js 如果是,那么它会从缓存中加载吗?
我在 newtwork 选项卡中看到它再次加载相同的文件,即 xyz.js,而不是从缓存中与已经包含在一个模板中的 html 模板相同 ng-inlcude 它不会从缓存中加载。
任何帮助将不胜感激。谢谢。
我的申请流程如下:
index.html有
<script type="text/javascript" src="libs/requirejs/require.js" data-main="config.js"></script>
在Config.js 中,我正在手动引导应用程序。
requirejs.config({
"paths":{
"angular": "libs/angular/angular.min",
"angular-route":"libs/angular-route/angular-route",
"angular-sanitize":"libs/angular-sanitize/angular-sanitize",
"jquery-ui":"libs/jquery-ui/jquery-ui.min",
"ngAnimate":"libs/angular-animate/angular-animate.min",
"angularSrapCore":"libs/angular-strap/dist/angular-strap.min",
"angularStrap":"libs/angular-strap/dist/angular-strap.tpl.min"
},
"shim": {
"angular": {
"exports": "angular"
},
"drutasApp": {
deps: ["angular", "angular-route","angular-sanitize","jquery-ui","ngAnimate"]
},
"angular-route": {
deps: ["angular"]
}
}
});
require(['angular','app'
], function (angular) {
angular.element(document).ready(function () {console.log("app bootstraped");
angular.bootstrap(document, ['app']);
});
});
app.js与config.js在同一目录下,代码如下...
define(['scripts/routes.js','scripts/services/dependencyResolverFor.js'], function(config, dependencyResolverFor)
{
var app = angular.module('app', ['ngRoute','ngAnimate','ngSanitize']);
app.config(
[
'$routeProvider',
'$locationProvider',
'$controllerProvider',
'$compileProvider',
'$filterProvider',
'$provide',
function($routeProvider, $locationProvider, $controllerProvider, $compileProvider, $filterProvider, $provide)
{
app.controller = $controllerProvider.register;
app.directive = $compileProvider.directive;
app.filter = $filterProvider.register;
app.factory = $provide.factory;
app.service = $provide.service;
app.constant = $provide.constant;
$locationProvider.html5Mode(false);
if(config.routes !== undefined)
{
angular.forEach(config.routes, function(route, path)
{
$routeProvider.when(path, {
templateUrl:route.templateUrl,
resolve:dependencyResolverFor(route.dependencies)
});
});
}
if(config.defaultRoutePaths !== undefined)
{
$routeProvider.otherwise({redirectTo:config.defaultRoutePaths});
}
}
]);
return app;
});
`routes.js` is as following...
define([], function()
{
return {
defaultRoutePath: '/',
routes: {
'/': {
templateUrl: 'views/home.html',
dependencies: [
'scripts/controllers/home'
]
},
'/abc-view': {
templateUrl: 'views/abc.html',
dependencies: [
'scripts/controllers/abc',
'scripts/controllers/xyz'
]
},
'/xyz-view': {
templateUrl: 'views/xyz.html',
dependencies: [
'scripts/controllers/xyz'
]
}
}
};
});
dependencyResolver.js
define([], function()
{
return function(dependencies)
{
var definition =
{
resolver: ['$q','$rootScope', function($q, $rootScope)
{
var deferred = $q.defer();
require(dependencies, function()
{
$rootScope.$apply(function()
{
deferred.resolve();
});
});
return deferred.promise;
}]
}
return definition;
}
});
【问题讨论】:
-
我不知道路由对象下的
dependencies属性是什么?我所能做的就是猜测您没有使用 requireJS 来加载您的xyz.js。因为如果提供这样的字符串 requireJS 会将.js添加到字符串的末尾,因此您将无法加载'scripts/controllers/xyz.js.js'。我可以帮助你解决这个问题,但我需要更多关于你正在使用的router的名称的信息(对我来说不像ui-route或ng-route)。 -
如果我没有在最后添加 .js 扩展名,那么如果没有使用 requireJS 应该会出现错误。如果我省略 .js 扩展名,那么加载它就没有问题。如果我写错了,我要求请纠正。
-
如上所述。
requireJS不需要.js扩展。它将自行添加此扩展。 ---- 对于 JS 文件 如果您从 requireJS 加载 js 文件,它将不会再次加载该 js 文件。 ---- FOR HTML FILE requireJS 与此无关,但有角度。并且行为将是相同的。 HTML 视图将被重用,而不会触发任何 HTTP 请求。 -
-
是的,这就是为什么我问你使用的
router是什么?因为看起来你根本没有使用 requireJS。我尽可能需要你的真实代码,js文件给你答案。
标签: angularjs requirejs angular-ui-router require