我有一个由 2 个主要部分组成的单页应用程序:
1.-A top bar that has dynamic content(there is a shopping cart)
2.-A dynamic component that gets loaded based on the url.
有几次组件使用邮箱进行通信,问题是一旦组件本身被处理,内部创建的订阅就不是. 我知道我可以手动向每个组件添加一个 dispose 函数,然后在其中处理订阅,但是有没有办法以自动方式为所有组件执行此操作?
我确实知道如何循环所有属性并检查它们是否是订阅,但我需要一种方法以某种方式将此行为附加到所有组件,而无需手动将此 dispose 函数附加到所有组件。
我知道邮箱带有一个重置方法,我可以在我的路由库中调用,但我不想这样做,因为这样顶部栏也会失去它的订阅。
为了给你一些观点,这是主索引页面的样子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Participant Dashboard</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<!-- styles -->
<link href="../css/bs3/bootstrap.css" rel="stylesheet">
<link href="../css/bs3/override-bs3.css" rel="stylesheet">
<script src="../scripts/global/requireConfig.js"></script>
<script data-main="../consumer/scripts/require-config" src="../scripts/require.js"></script>
</head>
<body>
<top-bar params="routeParams:currentPageArguments"></top-bar>
<div data-bind="component: { name: currentPage, params: currentPageArguments }">
</div>
</body>
</html>
这是我的自定义组件加载器:
function registerConventionLoader() {
var koNamingConventionLoader = {
getConfig: function (name, callback) {
var widgetName;
var widgetConfig = common.findComponentConfig(name);
if (widgetConfig != null) {
widgetName = name.substr(widgetConfig.Prefix.length);
var widgetNamePascalCase = common.toPascalCase(widgetName);
var filePath = widgetConfig.Path;
var viewModelConfig = {require: filePath + widgetNamePascalCase};
var templateConfig = {require: "text!" + filePath + widgetNamePascalCase + '.html'};
callback({viewModel: viewModelConfig, template: templateConfig});
}
else {
callback(null);
}
}
};
ko.components.loaders.push(koNamingConventionLoader);
}