2013-10-14 2 views
1

У меня есть система, где я могу создать несколько «домов» и «людей». Следующим шагом для меня является то, что я хочу отобразить некоторую информацию о доме, на который я нажимаю. Тем не менее, я могу получить доступ только к информации о последнем из созданных домов, а не о том, какой дом я нажимаю.Может отображать только информацию о последнем созданном объекте | Перезаписывает предыдущие

Смотрите изображение здесь:

enter image description here

Дом по праву является последний дом, который я создал. Информация отображается корректно. Но если я нажму первый дом (тот, который слева), моя информация не изменится.

Я создал JSFIDDLE здесь, где мы можем попробовать его для себя.

Я предполагаю, что моя проблема лежит где-то в моей objHouse.click (функция() Я попробовал несколько различных способов Прямо сейчас я пытаюсь предназначаться это следующим образом:..

$('#BtnCreateHouse').click(function(){ 
oHouse = CreateHouseInMemory(); 
CreateHouseInLayout(oHouse); 


}); 

function CreateHouseInMemory() 
{ 
var oHouse = 
{ 
    "id": "H"+GetRandomNumber(999, 999999999999), 
    "StreetMame": $('#StreetName').val(), 
    "Number": $('#Number').val(), 
    "MaxPeople" : $('#MaxPeople select').val(), 
    "aPeople": [] 
} 
aHouses.push(oHouse); 
console.log(oHouse); 
return oHouse; 
} 

function CreateHouseInLayout() 
// See JSFIDDLE, to much code to be posted here. 


var objHouse = $('#' + oHouse.id) 

objHouse.click(function(){ 
    $("#WindowDisplayHouseInfo").show();        
    $('#ShowId').text("ID: " + oHouse.id); 
    $('#ShowStreetName').text("Street Name: " + oHouse.StreetMame); 
    $('#ShowNumber').text("Number: " + oHouse.Number); 
    $('#ShowMaxInhabitants').text("Max inhabitants: " + oHouse.MaxPeople); 

    for(var i = 0; i < oHouse.aPeople.length; i++) 
    { 
    $('#ShowInhabitants').html("<br />" + "Inhabitant: " + oHouse.aPeople.length 
           +"<br />" + "ID: " + oHouse.aPeople[i].id 
           +"<br />" + "Name: " + oHouse.aPeople[i].Name 
           +"<br />" + "Last Name: " + oHouse.aPeople[i].Lastname 
           +"<br />" + "Age: " + oHouse.aPeople[i].Age 
           +"<br />" + "Gender: " + oHouse.aPeople[i].sGender 
           ); 
    } 

     $('.DeleteHouse').click(function() 
     { 
      $(objHouse).children().each(function(){ 
       $(this).appendTo($('#City')).css({"top":"" , "left":""}); 
      }); 

      $(objHouse).remove();     
      $("#WindowDisplayHouseInfo").hide(); 
     }); 
}); 

Я очень надеюсь, что один из вас может сказать мне, что это то, что я делаю неправильно, я застрял в течение нескольких часов в настоящее время

UPDATE

Я обнаружил, что если я изменю..:

objHouse.click(function(){ 

в

$('.House').click(function(){ 

, а затем изменить

$('#ShowId').text("ID: " + oHouse.id) 

в

$('#ShowId').text("ID: " + this.id); 

Тогда он будет работать для ID, но если я Fx. write ("Street Name:" + this.StreetName); то это не сработает. Любая идея почему?

Обновлено JSFIDDLE здесь: http://jsfiddle.net/Adnaves/pcVR6/2/

+0

Это не проблема. Я могу получить класс. Идентификатор дома, используя this.id. Но у моего класса .House ничего не называется: StreetName. Это моя идея, которая имеет это значение. Поэтому я снова застрял. – Adnaves

+0

var oHouse = {"StreetMame": $ ('# StreetName'). Val()} Это прямо здесь. Не обращайте внимания на опечатку, она исправлена ​​в моих собственных файлах. – Adnaves

ответ

1

Внутри:

$('#BtnCreateHouse').click(function(){ 
oHouse = CreateHouseInMemory(); 
CreateHouseInLayout(oHouse); 
}); 

Вы не определяют вар oHouse в области видимости функции, а затем в функции CreateHouseInLayout не использовать переданный параметр, но глобальная переменная от ранее. Таким образом, функция click создает переменную oHouse в глобальной таблице символов, которая позже доступна CreateHourseInLayout, и это работает отлично в первый раз, но во второй раз, когда вы нажимаете, вы переписываете глобальную переменную и первый дом == второй дом. Что вам нужно сделать, это правильно сфера ваши переменные:

$('#BtnCreateHouse').click(function(){ 
    var oHouse = CreateHouseInMemory(); // Create the house var locally and pass it to the other function 
    CreateHouseInLayout(oHouse); 
}); 

function CreateHouseInMemory() { 
    var oHouse = { 
    "id": "H"+GetRandomNumber(999, 999999999999), 
    "StreetMame": $('#StreetName').val(), 
    "Number": $('#Number').val(), 
    "MaxPeople" : $('#MaxPeople select').val(), 
    "aPeople": [] 
    }; 
    aHouses.push(oHouse); 
    console.log(oHouse); 
    return oHouse; 
} 

function CreateHouseInLayout(oHouse) { // use the passed house object 
    var objHouse = $('#' + oHouse.id) 

    objHouse.click(function(){ 
    $("#WindowDisplayHouseInfo").show();        
    $('#ShowId').text("ID: " + oHouse.id); 
    $('#ShowStreetName').text("Street Name: " + oHouse.StreetMame); 
    $('#ShowNumber').text("Number: " + oHouse.Number); 
    $('#ShowMaxInhabitants').text("Max inhabitants: " + oHouse.MaxPeople); 

    for(var i = 0; i < oHouse.aPeople.length; i++) { 
     $('#ShowInhabitants').html("<br />" + "Inhabitant: " + oHouse.aPeople.length 
           +"<br />" + "ID: " + oHouse.aPeople[i].id 
           +"<br />" + "Name: " + oHouse.aPeople[i].Name 
           +"<br />" + "Last Name: " + oHouse.aPeople[i].Lastname 
           +"<br />" + "Age: " + oHouse.aPeople[i].Age 
           +"<br />" + "Gender: " + oHouse.aPeople[i].sGender 
           ); 
    } 
    $('.DeleteHouse').click(function() { 
      $(objHouse).children().each(function(){ 
       $(this).appendTo($('#City')).css({"top":"" , "left":""}); 
      }); 

      $(objHouse).remove();     
      $("#WindowDisplayHouseInfo").hide(); 
    }); 
    }); 
} 

Имейте в виду, что жгутов метод CreateHouseInLayout теперь переменная oHouse является локальным, и все функции, созданные в рамках этого можно получить доступ к нему. Таким образом, ваш objHouse.click (function() {}) также имеет доступ к этой локальной копии и отображает правильную информацию. Где objHouse - это один элемент, который представляет этот конкретный дом. Если вы используете $ ('. House'). Click(), как в примере JSFIDDLE, вы привязываете обратный вызов ко всем элементам, но с одним объектом oHouse, поэтому все они будут отображать одну и ту же информацию (т. Е. используйте метод objHouse).

+0

Большое вам спасибо. И спасибо за объяснение того, что вы сделали. Теперь я также смогу сделать это на своих машинах и т. Д. – Adnaves

+0

КПП. Возможно, вы заметили мой цикл. Если я перетащил человека поверх своего дома, я должен увидеть информацию о людях, которые там живут. Но сейчас он просто показывает мне последнего человека, который помещен в дом. У вас есть идея, как я могу это исправить? – Adnaves

+1

То же, что и другой, для всех домов создается файл $ ('. House'). Droppable, но он ссылается только на последний. внутри CreateHouseInLayout убедитесь, что вы привязываете события только к определенному элементу DOM, который представляет дом. Кроме того, чтобы избежать путаницы, вы можете хранить свои объекты в элементах с помощью jQuery.data. Поэтому, когда вы создаете человека, вы можете сделать personObj.data ('info', oPerson), а затем, когда вы будете отображать информацию для дома, просто выполните objHouse.find ('. Person'). Each (function() {var i = $ this.data ('info'); ...}); , Возможно, попробуйте что-то подобное http://jsfiddle.net/Gf2c2/1/ –

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