2012-01-31 2 views
0

Я имею вопрос, где я получаю ошибку говорит ...Uncaught TypeError: Объект не имеет методы ... Javascript

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

Я действительно не уверен, что причина этого. 'f771b328ab06' - это идентификатор пользователя в ошибке. Я могу добавить нового пользователя и предотвратить дублирование пользователей, но когда я попытаюсь добавить их местоположение в список, я получаю эту ошибку.

Кто-нибудь видит, что происходит не так? Ошибка также возникает в операторе инициализации else (если идентификатор пользователя существует, просто добавьте его и не создавайте нового пользователя). У меня есть некоторые примечания в коде, и я уверен, что это отчасти связано с тем, как я изменил пример, предоставленный другим пользователем.

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

Поскольку я получить идентификатор из телефона и не нужно, чтобы создать его здесь (только получить его), я закомментировать ту часть, которая создает случайный идентификатор. При этом мне пришлось добавить параметр в метод createUser в пределах Users(), чтобы я мог передать ID в качестве аргумента из Initialize(). Смотрите изменения в 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]; 
}; 

Если у кого-то есть предложения, я бы очень признателен. Благодаря!

ответ

2

Здесь вы получаете user_id по:

var user_id = data[0]; 

Так что это часть JSon ответа: может быть строкой или другой dictionnary, это не может быть объектом пользователя. Вы должны попытаться обновить свой код в функции успеха внутри «если» блок по:

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

Ну, я новичок в JS, и я просто хотел, чтобы иметь возможность искать ключи, чтобы предотвратить идентификаторы из дублируется , Я помещаю «1» там как заполнитель. Есть ли лучший способ сделать это? – mkyong

+0

Я понял. Я не определил пользователя в статусе if. К сожалению. Я прокомментировал раздел 'users.users [user_id] =" 1 ";' и, похоже, работает нормально. Спасибо за понимание. – mkyong

+0

Если вы новый Checkout Firebug, это может действительно помочь вам отладить ваш код. – AsTeR

Смежные вопросы