与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();
}
答案 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);
答案 1 :(得分:0)
简单 - 将ViewAttached代码移动到Activated函数中 - 然后它只会在第一次加载View时加载。