删除durandal中的ko suscrptions?

时间:2013-07-11 15:31:45

标签: javascript knockout.js durandal

与durandal和淘汰赛合作我对这些属性有一些疑问。基本上在我的viewAttached方法中,我对可观察属性有一些疑问,当我加载视图时,第一次工作非常好。在第二次加载视图时,我遇到了一些问题,因为执行内部的代码被执行(我不想要的东西)。 代码是这样的:

export var viewAttached = function (view) {


toDate.subscribe(function (newValue) {      
    isLoading(true);
    return datacontext.getData(newValue).then(function () {
        isLoading(false);
    });
});

fromDate.subscribe(function (newValue) {       
    isLoading(true);
    return datacontext.getData(newValue).then(function () {
        isLoading(false);
    });
});
}

暂时执行suscription中的代码以便第二次加载我的视图,这是错误的。我想知道是否有可能在我卸载我的视图后删除这个属性的嫌疑人。那可能吗?是否可以知道视图何时卸载?任何帮助都是相关的。

更新 我尝试删除Activate函数中的suscription(参见durandal docs),但是suscription代码还没有。

export function activate() {      
   //remove suscriptions
    toDate.subscribe(function (newValue) {
     //do nothing
    });

    fromDate.subscribe(function (newValue) {
     //do nothing
    });   
}

更新 fromDate和ToDate声明为(我正在使用typescript)

export var fromDate = <any>ko.observable();
export var toDate = <any>ko.observable();

fromDate和toDate,默认设置为激活方法:

function loadInitData() {   
   var focusDate = ko.observable(selectedDate);
   fromDate(firstDayOfMonth(focusDate));
   toDate(getLastDayOfMonth(focusDate));
   loadFilterLookups();
   loadRegistrations();   
}


export function activate() {      
   loadInitData();
}

2 个答案:

答案 0 :(得分:3)

基本解决方案

您问过如何取消订阅订阅KnockoutJS的内容。

Knockout observable subscriptions只为此公开.dispose()函数。

订阅时:

var subscription = toDate.subscribe(function (newValue) {
 //do nothing
});

清理:

subscription.dispose();

如果您希望将其用于多个订阅,您可能需要考虑将它们推送到数组中,然后在所有这些订阅之后进行清理,例如

var subs = [];
function subSafe(observable,function){
    subs.push(observable.subscribe(function));
}
function unsubscribeAll(){
    subs.forEach(function(subscription){
        subscription.dispose();
    });
}

一个自包含的例子。

假设我们有两个按钮和一个值,一个按钮会增加该值。 我们有一个价值变化的监听者,它有一个alert。 当我们点击第二个按钮时,订阅将被删除。

<强> HTML:

<button data-bind="click: $root.inc">Inc</button>
<button data-bind="click: $root.unsub">Remove subscription</button>

<强> JavaScript的:

var vm = {
    val:ko.observable(0),
    inc:function(){
        vm.val(vm.val()+1);
    },
};
vm.sub = vm.val.subscribe(function(newVal){
   alert("Increased to "+newVal); 
});
vm.unsub = function(){
    vm.sub.dispose();    
}
ko.applyBindings(vm);

Here is a short fiddle illustrating the process

答案 1 :(得分:0)

简单 - 将ViewAttached代码移动到Activated函数中 - 然后它只会在第一次加载View时加载。