我最近开始开发一个使用 Durandal.js 的 SPA 应用程序。我们有几个视图和模型,它们在不同时间组合/加载到应用程序中。
例如:MyFavorites.js + MyFavorites.html
有没有办法让 durandal 将视图“链接”到 css 文件(在这种情况下可能是 MyFavorites.css),以便它可以根据需要获取它并可能利用缓存?我可以直接在我的 html 文件中放置一个或标记,但我认为这是一种不好的做法。
我最近开始开发一个使用 Durandal.js 的 SPA 应用程序。我们有几个视图和模型,它们在不同时间组合/加载到应用程序中。
例如:MyFavorites.js + MyFavorites.html
有没有办法让 durandal 将视图“链接”到 css 文件(在这种情况下可能是 MyFavorites.css),以便它可以根据需要获取它并可能利用缓存?我可以直接在我的 html 文件中放置一个或标记,但我认为这是一种不好的做法。
Durandal 没有专门针对此的任何东西。但是,有一个 require.js css 加载器插件,您可以从与该功能关联的一个 js 模块中使用它。我认为这样做有一些“陷阱”,但如果你真的想要动态 css 注入,那么值得研究一下。
我创建了一个插件。您可以将其用于 Durandal 2.0。
define(['jquery'], function ($) {
return {
loadCss : function (fileName) {
var cssTag = document.createElement("link")
cssTag.setAttribute("rel", "stylesheet")
cssTag.setAttribute("type", "text/css")
cssTag.setAttribute("href", fileName)
cssTag.setAttribute("class", "__dynamicCss")
document.getElementsByTagName("head")[0].appendChild(cssTag)
},
removeModuleCss: function () {
$(".__dynamicCss").remove();
}
};
});
您可以在视图模型中使用它,如下所示。
define(['plugins/cssLoader'], function (cssLoader) {
var ctor = function () {
this.compositionComplete = function () {
cssLoader.loadCss("sample.css");
cssLoader.loadCss("sample2.css");
};
this.deactivate = function () {
cssLoader.removeModuleCss();
}
};
return ctor;
});
我不确定为什么在视图的锚标记上放置 id 或 class 是“不好的做法”(CSSlist 会为 id 大喊大叫,但我认为这很愚蠢);这似乎是一个非常优雅的解决方案,它使用 css 提供给您使用的级联。我认为这是Head JS动态采用的方法。您可能会对此进行调查,但我不确定它与 Require JS 的效果如何。无论如何,手动方法应该可以正常工作。您唯一没有得到的是相关css的延迟加载。
另一种方法(现在可以在 Durandal 包含的 Knockout 示例中看到)是<style type='text/css'>...</style>
在视图 html 的顶部放置一个部分。这为您提供了延迟加载,但代价是您的 css 不在单独的文件中。
如果您的自定义视图样式需要应用于多个视图,您可能会采用前一种方法来保持 DRY(当然,使用类而不是 id)。
另外,请从 RequireJS 文档中查看此内容。