0

我正在创建一个列表页面,其中有两个日期选择器和一个表。页面的想法是使用日期选择器的默认参数加载带有一些注册数据的页面,之后用户将能够根据日期选择器过滤器选择他想要查看的内容。为了运行我的应用程序,我创建了两个属性 fromDate 和 toDate 并且我正在使用 suscribe 方法来了解日期何时更改,因此当日期更改时我应该调用我的服务(或一些过滤代码)。我的页面的问题是,在加载我的页面时,默认情况下会根据我自己的逻辑设置控件,因此我应该调用我的服务的代码被调用两次(一个在 loadInitData 中,其他在订阅中)

define(["require", "exports", 'services/logger',  '../../services/Assessment/datacontext'], function(require, exports, __logger__, __datacontext__) {
var logger = __logger__;

var datacontext = __datacontext__;    
exports.title = 'AssessmentListing';   
exports.fromDate = ko.observable(new Date('2012/12/12'));
exports.toDate = ko.observable(new Date('2012/12/12'));

function activate() {
   loadInitData();
}

exports.activate = activate;
function loadInitData() { 
   var focusDate = ko.observable(new Date('2013/07/06'));
   exports.fromDate(firstDayOfMonth(focusDate));
   exports.toDate(getLastDayOfMonth(focusDate));
   // calls to services
} 

exports.toDate.subscribe(function (newValue) {
   /*THIS CODE SHOULD BE EXECUTED JUST WHEN THE USER CHANGE THE DATE FROM THE CONTROL*/
   alert("new selection :");
});
exports.fromDate.subscribe(function (newValue) {
   /*THIS CODE SHOULD BE EXECUTED JUST WHEN THE USER CHANGE THE DATE FROM THE CONTROL*/
   alert("new selection");
});

function getLastDayOfMonth(focusDate) {
  var d = new Date(Date.apply(null, focusDate));
  d.setMonth(d.getMonth() + 1);
  d.setDate(0);
  return d;
}

function firstDayOfMonth(focusDate) {
   var d = new Date(Date.apply(null, arguments));
   d.setDate(1);
   return d;
}

function viewAttached() {
}
exports.viewAttached = viewAttached;
})

尝试在 loadInitData 和 loading(false) 的开头和 loadInitData 的结尾添加一个新的布尔属性来表示 loading(true)。这个作品不错。但仍然不止一次调用订阅代码。

4

1 回答 1

1

解决这个问题的一个简单方法可能是延迟设置订阅,直到你的视图模型被初始化:

function activate() {
   loadInitData();

    exports.toDate.subscribe(function (newValue) {
       /*THIS CODE SHOULD BE EXECUTED JUST WHEN THE USER CHANGE THE DATE FROM THE CONTROL*/
       alert("new selection :");
    });
    exports.fromDate.subscribe(function (newValue) {
       /*THIS CODE SHOULD BE EXECUTED JUST WHEN THE USER CHANGE THE DATE FROM THE CONTROL*/
       alert("new selection");
    });
}
于 2013-06-18T21:03:44.983 回答