2012-01-31 13 views
0

私はキャッチされない例外TypeError:オブジェクトが方法はありません... Javascriptを

"Uncaught TypeError: Object f771b328ab06 has no method 'addLocation'"

が、私は本当にこれを引き起こしているかわからないんだけど...私が言うエラーが出る問題を抱えています。 'f771b328ab06'はエラーのユーザーIDです。新しいユーザーを追加してユーザーの重複を防ぎますが、その場所をリストに追加しようとするとこのエラーが発生します。

誰かが間違っているのを見ていますか?このエラーは、初期化機能のelse文でも発生します(ユーザーIDが存在する場合は、場所を追加して新しいユーザーを作成しないでください)。コードにいくつかの注釈がありますが、これは部分的には別のユーザーが提供している例をどのように変更したのかによるものと確信しています。

function User(id) { 
    this.id = id; 

    this.locations = []; 

    this.getId = function() { 
     return this.id; 
    }; 
    this.addLocation = function(latitude, longitude) { 
     this.locations[this.locations.length] = new google.maps.LatLng(latitude, longitude); 
     alert("User ID:"); 
}; 
    this.lastLocation = function() { 
     return this.locations[this.locations.length - 1]; 
    }; 
    this.removeLastLocation = function() { 
     return this.locations.pop(); 
    }; 
} 

function Users() { 
    this.users = {}; 

    //this.generateId = function() { //I have omitted this section since I send 
     //return Math.random();  //an ID from the Android app. This is part of 
    //};        //the problem. 

    this.createUser = function(id) { 
     this.users[id] = new User(id); 
     return this.users[id]; 
    }; 
    this.getUser = function(id) { 
     return this.users[id]; 
    }; 
    this.removeUser = function(id) { 
     var user = this.getUser(id); 
     delete this.users[id]; 

     return user; 
    }; 
} 

var users = new Users(); 

function initialize() { 
    alert("Start"); 
    $.ajax({          
     url: 'api.php',            
     dataType: 'json',     
     success: function(data){ 
      var user_id = data[0]; 
      var latitude = data[1]; 
      var longitude = data[2]; 

      if (typeof users.users[user_id] === 'undefined') { 
       users.createUser(user_id); 
       users.users[user_id] = "1"; 
       user_id.addLocation(latitude, longitude); // this is where the error occurs 
      }   
      else { 
       user_id.addLocation(latitude, longitude); //here too 
       alert(latitude); 
      } 
     } 
    })  
} 
setInterval(initialize, 1000); 

私は携帯電話からIDを取得し、(だけそれを受け取る)ここでそれを生成する必要はありませんので、私はランダムなIDを作成し、一部をコメントアウト。これを行うにあたり、私はInitialize()から引数としてIDを渡すことができるように、Users()の中のcreateUserメソッドにパラメータを追加しなければなりませんでした。以下createUserへの変更を参照してください。

前に、生成されたIDで(番号が生成された部分はコメントを上記のコードブロックである):

this.createUser = function() { 
    var id = this.generateId(); 
    this.users[id] = new User(id); 
    return this.users[id]; 
}; 

後、として渡されたIDと引数:

this.createUser = function(id) { 
    this.users[id] = new User(id); 
    return this.users[id]; 
}; 

誰かが何か提案があれば、本当に感謝しています。ありがとう!だから、JSONの答えの一部だ

var user_id = data[0]; 

答えて

2

ここであなたがでuser_idを取得しているかもしれない文字列または別のdictionnary、これはユーザーオブジェクトにすることはできません。 JSに、私は新たなんだ

user = users.createUser(user_id); 

//The following line is a non sense for me you put an int inside 
//an internal structure of your class that should contain object 
//users.users[user_id] = "1"; 

user.addLocation(latitude, longitude); 
+0

まあ、私はちょうど複製されるからIDを防止するためのキーを検索できるようにしたかった:あなたは「もし」ブロックによって内部であなたの成功の機能で、あなたのコードを更新するようにしてください。そこに「1」をプレースホルダとして配置します。これを行うより良い方法はありますか? – mkyong

+0

私はそれを考え出した。私はif文でユーザを定義していませんでした。おっとっと。私は 'users.users [user_id] =" 1 ";'セクションをコメントアウトしたところ、うまくいきました。洞察に感謝します。 – mkyong

+0

新しいチェックアウトのFirebugなら、実際にコードをデバッグするのに役立つかもしれません。 – AsTeR

関連する問題