2017-10-29 5 views
0

Ich erstelle ein einfaches Formular, wo wir 2 Datumseingaben haben und die Gültigkeit des Datumsobjekts prüfen; Ich folge dem Prototypmuster und erstelle 2 Methoden.'Dies' ist undefiniert innerhalb einer Prototyp-Methode, die Promise verwendet und von einer anderen Prototyp-Methode desselben Objekts aufgerufen wird?

dies war bisher in Ordnung arbeiten, aber wenn ich Versprechen innerhalb Validate-Methode verwenden, gibt es Fehler „nicht Eigentum‚startdate‘undefinierter lesen kann“. Also meine Frage ist, warum dies in diesem Fall nicht definiert ist?

und wie es zu lösen?

unten ist mein Schnipsel.

(function() { 
 
    'use strict'; 
 

 

 
    let startDate, endDate; 
 

 
    const _calculate = function() { 
 
     // console.log('inside constructor'); 
 
     this.endDate = new Date(); 
 
     this.ageFind = true; // for first tab 
 
    }; 
 

 
    _calculate.prototype = { 
 
     //function to get data for calculating the time diff (setting startDate, endDate) 
 
     init: function(formName) { 
 
      // console.log("getDifference"); 
 
      if (this.countdown) { 
 
       clearInterval(this.countdown); 
 
      } 
 
      // other form name is 'secondForm' 
 
      this.ageFind = (formName === 'firstForm') ? true : false; 
 
      var fd = new FormData(document.getElementById(formName)); 
 
      // Start date 
 
      let startDay = fd.get('start_date'); 
 
      let startMonth = fd.get('start_month'); 
 
      let startYear = fd.get('start_year'); 
 
      this.startDate = new Date(`${startMonth}-${startDay}-${startYear}`); 
 
      // End date 
 
      let endDay = fd.get('end_date'); 
 
      let endMonth = fd.get('end_month'); 
 
      let endYear = fd.get('end_year'); 
 
       this.endDate = new Date(`${endMonth}-${endDay}-${endYear}`); 
 
      
 
      this.isValidDate().then((res) => { 
 
       console.log('is valid'); 
 
      }).catch((err) => { 
 
       console.error('Invalid date.', err); 
 
      }); 
 
     }, 
 

 
     isValidDate: function() { 
 
      console.log("validateDate", this.startDate, this.endDate); 
 
      return new Promise(function(resolve, reject) { 
 
       console.log('inside promise'); 
 
       if (isFinite(this.startDate) && isFinite(this.endDate)) { 
 
        var [startTimeStamp, endTimeStamp] = [this.startDate.getTime(), this.endDate.getTime()]; 
 
        // console.log("startTimeStamp, endTimeStamp", startTimeStamp, endTimeStamp); 
 
        // swap the date if `end date` is smaller than `start date` 
 
        if (endTimeStamp < startTimeStamp) { 
 
         [this.startDate, this.endDate] = [this.endDate, this.startDate]; 
 
        } 
 
        resolve(true); 
 
       } else { 
 
        reject(false); 
 
       } 
 
      }); 
 
     } 
 
    }; 
 

 
    window._cal = new _calculate(); 
 
})();
div { 
 
float: left; 
 
} 
 

 
.start-date,.end-date { 
 
margin: 4px; 
 
}
<form name="firstForm" id="firstForm"> 
 
    <fieldset class="start-date"> 
 
    <legend>Start Date</legend> 
 
    <select id="start_date" name="start_date"> 
 
     <option selected disabled>Start Date</option> 
 
     <option value="1">1</option> 
 
    </select> 
 
    <select id="start_month" name="start_month"> 
 
     <option selected disabled>Start Month</option> 
 
     <option value="10">October</option> 
 
    </select> 
 
    <select id="start_year" name="start_year"> 
 
     <option selected disabled>Start Year</option> 
 
     <option value="2016">2016</option> 
 
     <option value="2017">2017</option> 
 
    </select> 
 
    </fieldset> 
 
    <fieldset class="end-date"> 
 
    <legend> End date</legend> 
 
     <select id="end_date" name="end_date"> 
 
     <option selected disabled>End Date</option> 
 
     <option value="1">1</option> 
 
    </select> 
 
    <select id="end_month" name="end_month"> 
 
     <option selected disabled>End Month</option> 
 
     <option value="10">October</option> 
 
    </select> 
 
    <select id="end_year" name="end_year"> 
 
     <option selected disabled>End Year</option> 
 
     <option value="2016">2016</option> 
 
     <option value="2017">2017</option> 
 
    </select> 
 
    </fieldset> 
 
    <br/> 
 
    <button type="button" onclick="_cal.init('firstForm')">Calculate!</button> 
 
</form>

+0

nur darauf hinweisen, dass Ihr Code mehrere Probleme mit Cross-Browser-Kompatibilität hat! – Mouser

+0

Werden Sie bitte erwähnen, wird es sehr hilfreich –

+0

'FormData.get' wird nicht von MS Rand unterstützt und' [this.startDate, this.endDate] = [this.endDate, this.startDate]; 'nicht in Rand. – Mouser

Antwort

2

ist der Kontext aufgrund function verloren, müssen Sie es Schließung:

isValidDate: function() { 
     var self = this; 
     return new Promise(function(resolve, reject) { 
      console.log(self.startDate); 
      // ... 
     }); 
    } 
+0

, aber ich muss die Daten binden mit 'dies ', wenn das Startdatum ist größer als das Enddatum. macht das mit dem wieder zu binden? Es gibt andere Methoden, die dieselbe Variable verwenden. –

+0

Sie könnten alle 'this' in' self' ändern. Es hat die gleiche Bedeutung innerhalb von function() - Block. – egon12

+0

Ich verstehe, dass das Ändern 'self' mit' this' den Umfang in das ändern method.but gibt es mehrere Methoden, die diese 'startDate' und' endDate' verwenden? Deshalb wurden diese Variablen im globalen Gültigkeitsbereich der Funktion hinzugefügt. Ansonsten muss ich dieses neue Startdatum und Enddatum in jeder Methode senden? –

Verwandte Themen