如何避免运行代码两次使用ko属性

how to avoid run code twice using ko property

本文关键字:两次 ko 属性 运行 何避免 代码      更新时间:2023-09-26

我正在创建一个列表页面,其中有两个日期选择器和一个表。页面的想法是使用日期拾取器的默认参数加载一些注册数据的页面,之后用户将能够根据日期拾取器过滤器选择他想要看到的内容。为了运行我的应用程序,我创建了两个属性fromDate和toDate,我使用订阅方法来知道日期何时更改,以便在日期更改时调用我的服务(或一些过滤代码)。我的问题与我的页面是,此刻加载我的页面的控制默认设置从我自己的逻辑,所以我的代码,应该调用我的服务被调用两次(一个在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的开始和loadInitData的结束处说loading(true)和loading(false)。这项工作很好。但是订阅代码仍然被调用了不止一次

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

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");
    });
}