【问题标题】:Stop extend and subscribe on observable for a different page停止扩展并订阅不同页面的 observable
【发布时间】:2015-02-23 21:51:42
【问题描述】:
当移动到 SPA 中的不同页面时,我不知道这在回顾中是如何工作的。我有一个特定的页面,我总是希望收到更新通知并订阅它。然而,这个可观察的hasUpdate 被用在其他页面上,有点像一个全局变量。扩展和订阅是否会在页面更改时消失,还是我可以自己做?如果我可以自己通过将其更改为 null 或其他页面上的内容来做到这一点,你会怎么做?另外,如果我只想删除两个订阅中的一个,您可以使用订阅的 id 或其他内容来执行此操作吗?
app.viewModel.members.hasUpdate.extend({
notify: 'always'
});
app.viewModel.members.hasUpdate.subscribe(function () {
viewModel.modificationCheck.update();
});
【问题讨论】:
标签:
javascript
knockout.js
single-page-application
publish-subscribe
【解决方案1】:
订阅的dispose 方法就是您要查找的内容。 Knockout 没有“页面”或“导航”的概念,因此您必须自己处理此逻辑。最简单的情况如下所示:
hasUpdateSubscription = app.viewModel.members.hasUpdate.subscribe(function () {
viewModel.modificationCheck.update();
});
//When you change pages
hasUpdateSubscription.dispose();
实际上,尽管您可能想要一些更有条理的方式来做到这一点。就个人而言,我建议为每个页面使用 KO ViewModel。比如:
function PageOneViewModel() {
hasUpdateSubscription = app.viewModel.members.hasUpdate.subscribe(function () {
viewModel.modificationCheck.update();
});
this.dispose = function() {
hasUpdateSubscription.dispose();
}
}
然后页面可以在根视图模型上使用currentPage observable 处理,因此页面更改逻辑将包括以下内容:
var newPageVM = new PageTwoViewModel(); //create a view model for page 2
var oldPageVM = app.currentPage();
app.currentPage(newPageVM); //set page 2 as the current VM
oldPageVM.dispose(); //page VM dispose function should clean up subscriptions, etc.