Javascript 检查是否显示与当前ViewModel关联的DOM?

Javascript 检查是否显示与当前ViewModel关联的DOM?,javascript,knockout.js,knockout-3.0,Javascript,Knockout.js,Knockout 3.0,我有以下用例: 我正在创建淘汰自定义组件: ko.components.register("detail", { template: {require: "text!components/detail.html"}, viewModel: DetailViewModel }); 在DetailViewModel中,我正在执行一些需要60秒才能完成的操作,例如XHR。如果XHR失败,我将向用户显示一个关于它的通知 现在我的问题是XHR需要60秒,当它仍然处于“挂起”状态时,

我有以下用例:

  • 我正在创建淘汰自定义组件:

    ko.components.register("detail", {
        template: {require: "text!components/detail.html"},
        viewModel: DetailViewModel
    });
    
  • DetailViewModel
    中,我正在执行一些需要60秒才能完成的操作,例如XHR。如果XHR失败,我将向用户显示一个关于它的通知

现在我的问题是XHR需要60秒,当它仍然处于“挂起”状态时,用户导航到不再包含“细节”组件的页面,然后XHR失败。在这种情况下,我不想显示任何通知,因为如果不再显示原始组件,则无法显示故障通知

是否有方法在
DetailViewModel
函数中确定关联的DOM元素在页面上是否仍然“存在”?现在我正在使用VM的一些自定义属性(“
isVisible
”),并将
DetailViewModel.prototype.dispose
中的属性更改为
false
,但我想知道是否有一种更简单/更干净的方法可以在不声明任何自定义属性的情况下执行此操作?

您可以使用“createViewModel”组件注册中的处理程序,它接收componentInfo作为第二个参数。“componentInfo.element”是组件的DomeElement。因此,您可以访问它并检查其可见性

ko.components.register('detail', {
    viewModel: {
        createViewModel: function(params, componentInfo) {
            var domElement = componentInfo.element;
            // You can pass domElement as a parameter for the DetailViewModel
            return new DetailViewModel(params);
        }
    },
    template: {require: "text!components/detail.html"}
});