如何使用aurelia(jspm)中的加载程序插件拦截组件加载?
我想拦截Aurelia的模块加载以重定向一些调用 为了完成这些事情,aurelia加载程序有一个如何使用aurelia(jspm)中的加载程序插件拦截组件加载?,aurelia,jspm,aurelia-loader,Aurelia,Jspm,Aurelia Loader,我想拦截Aurelia的模块加载以重定向一些调用 为了完成这些事情,aurelia加载程序有一个addPlugin()接口。您可以添加一个后缀,如!myplugin添加到资源,以标记应使用该插件加载该资源 现在,当我使用自己的组件执行此操作时,它会加载JS文件,但HTML模板的名称会出错。就像我的公司的资源名称!myplugin它将加载my-comp.js,但尝试查找我的comp!myplugin.html,它与插件名称不再匹配 我在这里提供了这个问题的要点: main.js中的加载程序插件代码
addPlugin()
接口。您可以添加一个后缀,如!myplugin
添加到资源,以标记应使用该插件加载该资源
现在,当我使用自己的组件执行此操作时,它会加载JS文件,但HTML模板的名称会出错。就像我的公司的资源名称!myplugin它将加载my-comp.js,但尝试查找我的comp!myplugin.html,它与插件名称不再匹配
我在这里提供了这个问题的要点:
main.js中的加载程序插件代码基本上是:
loader.addPlugin('gate', {
fetch(address) {
console.info('Intercepted:', address);
var tmpParts = address.split('.');
var extension = tmpParts[tmpParts.length - 1].toLowerCase();
if (extension == 'css') {
console.debug('Loading as styles', address);
return loader.loadText(address);
} else if(extension == 'html') {
console.debug('Loading as template:', address);
return loader.loadTemplate(address);
} else {
console.debug('Loading as module:', address);
return loader.loadModule(address);
}
}
});
在模板中这样使用它(在要点中标记为问题1):
在此之后,应可以按如下方式加载组件:
<comp2></comp2>
<compose view-model="./comp2!gate"></compose>
甚至像这样:
<comp2></comp2>
<compose view-model="./comp2!gate"></compose>
相反,该模板的名称被弄乱了,浏览器控制台显示:
加载资源失败:服务器响应状态为404()
模板的预期名称为https://gist.host/run/1485182959149/comp2.html!gate
(包括插件)
如何修复加载程序插件以使其正常工作
加载程序是aurelia加载程序默认值1.0.0,JSPM为0.16.39,节点为6.5.0,NPM为3.10.5
我添加了第二个gist.run: 它稍微短一点。当我在
comp2.js
中使用@useView
decorator(用问题4标记)指定视图时,它可以工作-但我无法使用@useView
指定加载程序插件。我希望它使用相同的加载程序插件加载视图,或者能够使用@useView
指定加载程序插件
好的,我找到了一个解决方案,看起来它可以用更少的代码和补丁工作,而且它可以在两个GIST之间工作 本要点包含外部组件
comp3
:
这是一个基本的Aurelia应用程序,带有一个插件和一个小补丁,用于加载程序的ApplyPlugingTourl
方法:
如果基本URL是固定的,那么它应该适用于所有人。Aurelia应用程序从第一个要点加载comp3并显示它(您可以在comp3视图中看到紫色边框的定义)
目前有一个警告:SystemJS不支持CSS,因为SystemJS向其添加了扩展名.js
,看起来我必须处理这个问题
我不喜欢loader.applyPluginToUrl的路径,但SystemJS并不真正支持插件链接,因此顺序必须正确。此外,此解决方案需要所有外部组件设置@useView
,包括加载程序插件
有更好的方法吗