2012-04-06 10 views
0

returnDayNumberというグローバルメソッドに問題があります。私のJavaスクリプト内の関数を呼び出す場合、正常に動作します。しかし、関数を呼び出すボタンを作ったとき、「self.returnDayNumberは関数ではありません」(var self =これが問題を解決するかもしれないと思った)。ここ が私のコードです:Java Script単純関数呼び出し(スコープ内にない関数)

/* 
    * 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); 

私はKOのユーザモデルを作ったが、私はその関連を思ういけません。ここで私のHTMLは、そのKOの構文をメモしますが動作します。

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

おそらく簡単な間違いをしたり、範囲外です。私は簡単な質問を申し訳ありませんので、私はJavaスクリプトの初心者です。有用なプログラマーに多くのおかげです!

+1

また、上記のロジックはうるう年で正常に動作しますか? – Ramesh

+0

returnDayNumber関数を短縮する方法は次のとおりです。 monthArray = new Array(0,0,31,60,91,121,152,182,213,244,274,305,335); returnDayNumber = function(月、日) { if(月== 1) 戻り日; else if(月> 1 &&月<= 12) 戻り日+ monthArray [月]; else return 0; } フォーマットの不足を言い訳する必要があります。コメントはコードフォーマットを許可しません。 – Rhyono

+0

@Rhyono 'this'のようにコードの書式設定に目盛りを使用することはできます。 – mc10

答えて

1

saveThis機能の外に移動してvar self = this;を内部に入れないと、selfは正しい範囲にあります。

+0

これは治療をしました!非常にsteweありがとう! –

関連する問題