【发布时间】:2013-07-11 15:31:45
【问题描述】:
使用 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);
});
});
}
订阅里面的代码正在执行第二次加载我的视图,有什么问题。我想知道是否可以删除对此属性的订阅以卸载我的视图。那可能吗?有可能知道何时卸载视图?任何帮助都将不胜感激。
更新: 我尝试在激活函数中删除订阅(请参阅 durandal 文档),但订阅代码还在那里。
export function activate() {
//remove suscriptions
toDate.subscribe(function (newValue) {
//do nothing
});
fromDate.subscribe(function (newValue) {
//do nothing
});
}
更新: fromDate 和 ToDate 声明为(我正在使用打字稿)
export var fromDate = <any>ko.observable();
export var toDate = <any>ko.observable();
fromDate 和 toDate 并在 activate 方法上默认设置:
function loadInitData() {
var focusDate = ko.observable(selectedDate);
fromDate(firstDayOfMonth(focusDate));
toDate(getLastDayOfMonth(focusDate));
loadFilterLookups();
loadRegistrations();
}
export function activate() {
loadInitData();
}
【问题讨论】:
-
在定义
toDate和fromDate之后没有立即设置subscribe是否有原因? -
原因是因为在我的激活方法中,我使用 fromDate 和 toDate 的默认值调用我的服务。所以我所做的是:1)使用默认值设置变量 2)调用我的服务 3)从 UI 中为我的过滤器中的期货更改添加订阅。查看这篇文章:stackoverflow.com/questions/17178632/…
-
您能否展示您的 AMD 大纲,其中定义了
toDate和fromDate以及模块返回的是单例函数还是构造函数?如果使用单例,你的视图中是否打开了 cacheViews: true ? -
很遗憾我正在使用 TypeScript(我很遗憾地说,因为我更喜欢使用 pur js)。 typescript 如何将其代码转换为纯 js 的方式是创建一个名为 export 的依赖项。这样fromDate和toDate的声明就是:exports.fromDate = ko.observable(); export.toDate = ko.observable();
-
遗憾的是我的 TypeScript 不够流利 ;-),所以如果你可以添加编译后的 JavaScript。我想看看定义
addDate和fromDate的 JS 以及它周围的 requiredefine。
标签: javascript knockout.js durandal