VueJS: вычисляемое свойство с использованием другого вычисляемого свойства работает некорректно

это не они: post1, post2

Я создаю небольшой SPA, и поэтому я начал с этого базового принципа, который я протестировал и встроил в код ниже, с которым у меня возникли проблемы. он работает ТОЛЬКО в том случае, если я вызываю вторичное свойство в DOM (почему?), и я включил его, чтобы проиллюстрировать, откуда я начал, надеясь, что принципы будут переведены по мере того, как я создавал.

JS:

var app = new Vue({
  el: '#app',
  computed: {
    today: function() {
      return new Date().getTime();
    },
    tomorrow: function() {
      return this.today + (1*24*60*60*1000);
  },
});

ДОМ:

<div id='app'>
  <p>{{ today }}</p>
  <p>{{ tomorrow }}</p>
</div>

так. это работает. опять же, ТОЛЬКО если app.tomorrow вызывается в DOM. (Хотел бы я знать, как это НЕ нужно ...) НО моя проблема - это следующая часть, которую я основываю на этом стартовом коде. это НЕ работает:

JS:

var app = new Vue({
  el: '#app',
  data: {
    dueNow: 0,
    reports: { 90: [], 'DN': [] },
  },
  computed: {
    today() {
      return new Date().getTime();
    },
    tMinus30() {
      return new Date().getTime() - (30 * 24 * 60 * 60 * 1000);
    },
    dueNow() {
      var count = 0;

      $.each(this.rows, function(index, obj) {
        var workingDate = new Date(obj.dateSubmitted).getTime();
        console.log('workingDate: '+workingDate);
        console.log('today: '+this.today);      <-- console reports 'undefined'!?
        console.log('today: '+this.tMinus30);   <-- console reports 'undefined'!?

        if(workingDate < this.today && workingDate > this.tMinus30){
          console.log('knock, knock: due NOW');   <-- therefore this never fires
          count++;
          console.log('count: '+count);

          //  build reports array - doesn't work, but that's for another day...
          this.reports['DN']['count'] = push(count);
          this.reports['DN'][index]['reportID'] = push(obj.id);
          this.reports['DN'][index]['assetID'] = push(obj.assetid);
        }
      });
      return count;
    },
  }
});

ДОМ:

<div id='app'>
  <div class="col-lg-2">
  <h1 class="text-center pt-2">NOW</h1>
  <p>{{ today.getDay() }}</p>
  <p class="img-text mb-1" @click="expandInfo('DN')">{{ dueNow }}</p>
  </div>
</div>

так что я не только не получаю count строк, которые dueNow, я тоже не получаю today.getDay() вычисленных, что на основе это из VueJS, должно работать. Я подозреваю, что это летающий кошмар, но я его не вижу ... он ДЕЙСТВИТЕЛЬНО перебирает строки должным образом. он ДЕЙСТВИТЕЛЬНО вычисляет рабочую дату для каждой строки. но больше ничего не работает. Я думал, что понимаю VueJS достаточно хорошо, чтобы попытаться это сделать. и я даже построил его из первого примера ... но я не понимаю, что сломано.

какой принцип я упускаю, чтобы сделать этот гель? такое чувство, что какая-то концепция ускользнула от меня.

РЕДАКТИРОВАТЬ: я также прочитал эту статью, но не знаю, что это применимо, поскольку нет ничего, что не является уже не заявлено в данных ...

РЕДАКТИРОВАТЬ: ОК! :) мне нужно уточнить. когда я говорю "это не работает", я имею в виду, что вычисленное свойство tomorrow не отображает и сообщает другое вычисленное свойство в консоли как "undefined", несмотря на то, что оно (today) отображается нормально (без дополнительного метода) . мой ожидаемый / желаемый результат состоит в том, что я увижу число, указывающее, сколько строк прошло проверку и равно dueNow, и я хочу, чтобы today отображались как «понедельник», а tomorrow как «вторник» (например). последний должен быть взаимозаменяемым с другими функциями даты. если возможно, я также хотел бы, чтобы массив reports обновился должным образом ... но сейчас это выходит за рамки области видимости.


person WhiteRau    schedule 05.03.2020    source источник
comment
Значение this внутри функции, созданной $.each(this.rows, function(index, obj) {, не будет таким же, как в окружающей функции. Если вместо этого вы используете стрелочную функцию, т.е. $.each(this.rows, (index, obj) => {, this привязка будет правильной. Доступны альтернативные способы привязки значения this, если вы не хотите использовать стрелочные функции. Это не Vue, это просто стандартная привязка JS this.   -  person skirtle    schedule 05.03.2020
comment
Эта часть шаблона не имеет для меня смысла: {{ today.getDay() }}. Вычисляемое свойство today является числом, поэтому у него не будет getDay метода. Я предполагаю, что вы стремились к getDay методу Date, но today не Date. Сначала он создает Date, но затем вызывает getTime, который просто возвращает число.   -  person skirtle    schedule 05.03.2020
comment
Что касается того, почему вашему исходному примеру требуется tomorrow в вашем шаблоне, вам нужно будет дать более четкое объяснение того, что именно вы подразумеваете под "работает" и что происходит, когда он "не работает. '. Лично я бы не стал использовать для этого вычисляемое свойство, поскольку оно не имеет реактивных зависимостей, поэтому его нельзя обновить. Я бы просто вставил today вместо data.   -  person skirtle    schedule 05.03.2020
comment
@skirtle по поводу today.getDate проблемы: facepalm ... ты прав! Я ожидал, что он просто вернет число обратно в дату, а затем ... ну, вы поняли. Ладно. я исправлю это. Благодарность! теперь, когда я это вижу, имеет смысл.   -  person WhiteRau    schedule 05.03.2020
comment
@skirtle У меня нет проблем со стрелочными функциями, за исключением того, что я их не использовал. В последнее время я занимаюсь в основном PHP и Python, поэтому мне это не приходило в голову. освежу и разверну! Надеюсь, это принесет плоды в решении других проблем, таких как массив ...: P   -  person WhiteRau    schedule 05.03.2020
comment
@skirtle, я не знал, что data может содержать подобное вычисленное свойство. Я также не слишком беспокоился, так как данные должны быть статичными до следующей загрузки. хотя, если я могу быть перенесен в данные как есть, я буду счастлив принести с собой все дополнительные достоинства, которые приходят с этим. Я протестирую сегодня вечером и опубликую свои выводы.   -  person WhiteRau    schedule 05.03.2020