ООП JS: функция увеличивает дату несколько раз, и я не знаю почему? - PullRequest
0 голосов
/ 14 сентября 2011

Исходя из моей предыдущей темы, я продолжил проектировать следующие объекты.

/* --- LEAP Namespace --- */
    var LEAP = {};

/* --- LEAP.Schedule Object --- */
    LEAP.Schedule = function(){//init
      this.weeks = [];
      this.calculateWeeks();
    };

    LEAP.Schedule.prototype.pad = function (n) {
        return n>9 ? n : "0"+n;
    };

    LEAP.Schedule.prototype.calculateWeeks = function(){
        this.date = new Date ( 2011, 8, 5 ); // First week of new school year
        this.num = 36; // Calendar number of this week
        this.weeks.push(new LEAP.Schedule.week(this.date, this.num));

        for (var i = 1; i < 51; i++) {
            var week = i * 7;
            var updated_date = new Date ();
            updated_date.setDate(this.date.getDate() + week);

            if (this.num > 51) {
                this.num = 0;
            }
            this.num++;

            this.weeks.push(new LEAP.Schedule.week(updated_date, this.num));
        }
    };

    LEAP.Schedule.prototype.getWeeks = function(){
        return this.weeks;
    };


/* --- LEAP.Schedule.week Object --- */
    LEAP.Schedule.week = function(n_date, n_week){
        this.week = n_week;
        this.date = n_date;

        this.year = this.date.getFullYear();
        var JSMonth = this.date.getMonth();
        JSMonth += 1;
        this.month = JSMonth;
        this.day = this.date.getDate();
    };

    LEAP.Schedule.week.prototype.getJSDate = function(){
        return this.date;
    };

    LEAP.Schedule.week.prototype.getStartDate = function(){
        return this.year + "-" + LEAP.Schedule.pad(this.month) + "-" + LEAP.Schedule.pad(this.day);
    };

    LEAP.Schedule.week.prototype.getEndDate = function(){
        var EndOfWeek = this.date;
        EndOfWeek.setDate(this.date.getDate() + 6);

        var year = EndOfWeek.getFullYear();
        var month = LEAP.Schedule.pad(EndOfWeek.getMonth() + 1);
        var day = LEAP.Schedule.pad(EndOfWeek.getDate());

        return year + "-" + month + "-" + day;
    };

    LEAP.Schedule.week.prototype.getLabel = function(){
        return "Week " + this.week + ": " + this.day + (this.day==1||this.day==21||this.day==31?"st":this.day==2||this.day==22?"nd":this.day==3||this.day==23?"rd":"th") + " " + ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][this.month-1] + " " + this.year;
    };

Сейчас я использую поле <SELECT> для фильтрации некоторых других данных, которые успешно работают, крометот факт, что каждый раз, когда срабатывает событие $('#filter').change(), даты увеличиваются.

    WeeklyUpdate.init = function() {
        UWA.Data.getJson(WeeklyUpdate.URL + "?cmd=getPointTotals", WeeklyUpdate.getTotalPoints);

        var Scheduleobject = new LEAP.Schedule();
        var weeks = Scheduleobject.getWeeks();
        WeeklyUpdate.displayWeekFilter(weeks);
    }

    WeeklyUpdate.displayWeekFilter = function(weeks) {
        var WeekFilterDisplayHTML = '<select id="filter"><option>Click here</option><option value="all">- All, to date</option>';
        var now = new Date();

        for (var i = 0; i < weeks.length; i++) {
            if (weeks[i].getJSDate() < now) {
                var label = weeks[i].getLabel();
                WeekFilterDisplayHTML += '<option value="' + i + '">' + label + '</option>';
            }
        }

        WeekFilterDisplayHTML += '</select>';
        $('div#filter').html(WeekFilterDisplayHTML);

        //WeeklyUpdate.filterPointTotalsByStaff( $(this).val() )
        $("select#filter").change( function() { WeeklyUpdate.filterPointTotalsByStaff( weeks, $(this).val() ) } );
    }

    WeeklyUpdate.filterPointTotalsByStaff = function(weeks, val) {
        if (val >= 0 && val != "all") {
            var StartDate = weeks[val].getStartDate();
            var EndDate = weeks[val].getEndDate();

Если я добавлю alert(StartDate + ' // ' + EndDate); после этих переменных, я вижу, что EndDate увеличивается каждый раз,вместо того, чтобы увеличиваться один раз, а затем последовательно возвращать правильную конечную дату независимо от того, сколько раз она выбрана из поля SELECT.StartDate, с другой стороны, работает правильно каждый раз.

Что должно произойти, так это то, что this.date (который возвращает объект даты JS для запрашиваемой недели) должен быть началомнеделю, то функция getEndDate() должна увеличить эту дату на 6 дней и вернуть правильную дату в формате, совместимом с MySQL.Это не должно увеличиваться каждый раз, когда <OPTION> выбирается из поля SELECT;он всегда должен возвращать одну и ту же дату.

Я предполагаю, что это как-то связано с тем, как я использовал EndOfWeek = this.date;, но я не понимаю, почему или как.

Еще раз большое спасибо.

1 Ответ

1 голос
/ 14 сентября 2011

Возможно, это не имеет значения, но в любом случае это плохая форма:

      for (i = 1; i < 51; i++) {

Переменная i должна быть объявлена.

В заявлении (моя упаковка):

$("select#filter").change( function() { 
   WeeklyUpdate.filterPointTotalsByStaff( weeks, $(this).val() )
});

Вы не показываете, как недель инициализируется или присваивается значение. Существует свойство недель для LEAP.Schedule экземпляров, но выше оно используется в контексте глобальной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...