2012-04-06 5 views
0

Ich habe ein Problem mit einer globalen Methode namens ReturnDayNumber. Wenn ich die Funktion innerhalb meines Java-Skripts aufruft, funktioniert es einwandfrei. aber wenn ich einen Knopf machte, um die Funktion aufzurufen, sagte es: "self.returnDayNumber ist keine Funktion" (dachte var self = dies könnte das Problem lösen). hier ist mein Code:Java Script einfacher Funktionsaufruf (Funktion nicht im Bereich)

/* 
    * Global data 
    * used to centralize user data to be used in graphs 
    */ 
    var userModel = new userHealthModel(); 
    userModel.createUsers(); 

    userModel.addUser(); 


    var newChart = new NewHighCharts(); 

    returnDayNumber = function(month, day) 
    { 
     if(month==1) 
     { 
      return day; 
     } 
     else if(month==2) 
     { 
      return(31+day); 
     } 
     else if(month==3) 
     { 
      return(60+day); 
     } 
     else if(month==4) 
     { 
      return (91+day); 
     } 
     else if(month==5) 
     { 
      return(121+day); 
     } 
     else if(month==6) 
     { 
      return(152+day); 
     } 
     else if(month==7) 
     { 
      return(182+day); 
     } 
     else if(month==8) 
     { 
      return(213+day); 
     } 
     else if(month==9) 
     { 
      return(244+day); 
     } 
     else if(month==10) 
     { 
      return(274+day); 
     } 
     else if(month==11) 
     { 
      return(305+day); 
     } 
     else if(month==12) 
     { 
      return(335+day); 
     }   
    } 
    saveThis = function() 
    { 
     var self = this; 
     alert("your about to save!") 
     newChart.destroyChart(); 
     newChart= new NewHighCharts(); 
     var numberOfUsers = userModel.users().length; 
     var users = userModel.users(); 
     var weights = userModel.getWeights(); 
     var dates = userModel.getDates(); 
     var dataArray = []; 
     var xAndY = [] 
     var singleDate; 
     var name; 
     for(var i=0;i<numberOfUsers;i++) 
     { 
      name = users[i].name; 
      xAndY = []; 
      for(var x=0;x<dates.length-1;x++) 
      { 

       //extract month 
       var month = ([dates[i][x]].toString()).substring(0,2); 
       //extract day 
       day = parseInt(([dates[i][x]].toString()).substring(3,5)); 
       //add the day number and weight of users to an array of x and y coordinates 
       xAndY.push([self.returnDayNumber(month,day),weights[i][x]]) 
      } 
      newChart.addNewSeries(name,xAndY); 
     }  
    ///!!!!This works!!!/// 
    this.saveThis()//!!! 

    } 
    ko.applyBindings(userModel); 

Ich habe ein Benutzermodell KO, aber i dont seine relevanten denken. und hier ist mein HTML, beachte seine KO-Syntax, aber es funktioniert.

<button data-bind="click: saveThis">Save</button> 

Ich mache wahrscheinlich einen einfachen Fehler oder etwas ist außerhalb des Umfangs. Ich bin ein Java Script Anfänger so leid für die einfache Frage. Vielen Dank an hilfreiche Programmierer!

+1

Auch die obige Logik funktioniert gut mit Leap Jahren? – Ramesh

+0

Hier ist eine Möglichkeit, Ihre returnDayNumber Funktion zu verkürzen: monthArray = new Array (0,0,31,60,91,121,152,182,213,244,274,305,335); returnDayNumber = Funktion (Monat, Tag) { if (month == 1) Rückgabetag; sonst if (Monat> 1 && Monat <= 12) Rückgabetag + MonatArray [Monat]; sonst Rückgabe 0; } Sie müssen den Mangel an Formatierung entschuldigen; Kommentare erlauben keine Code-Formate. – Rhyono

+0

@Rhyono Sie können immer noch die Teilstriche für die Codeformatierung verwenden, wie 'this'. – mc10

Antwort

1

Verschieben Sie var self = this; außerhalb Ihrer saveThis Funktion nicht innerhalb, so ist self in den richtigen Bereich.

+0

das hat das Vergnügen gemacht! Vielen Dank Stewe! –