2016-05-13 14 views
8

Chcę zaktualizować moje płótno na każde żądanie AJAX, jeśli zostanie znaleziony nowy użytkownik lub nowe połączenie istniejących użytkowników.Zaktualizuj znacznik canvas HTML na każdym żądaniu AJAX z nowymi danymi

Mam użytkowników i połączeń między nimi:

var data=[ 
      { 
       "Id": 38, 
       "Connections":[39,40], 
       "Name":"ABc" 
      }, 
      { 
       "Id": 39, 
       "Connections":[40], 
       "Name":"pqr" 
      }, 
      { 
       "Id": 40, 
       "Connections":[], 
       "Name":"lmn" 
      }] 

w powyższym przykładzie użytkownik z Id:38 jest podłączony do user 39 and 40 i user 39 is connected to user 40 and user 40 jest już podłączony do user 39 and user 38 so user 40 Connection array is blank.

Mam jedną usługę internetową, którą będę uruchamiać co 1-2 sekundy, aby wyświetlić nowo przyłączonych użytkowników na tej stronie i nowe połączenie między istniejącymi użytkownikami, które zapisałem w moim stole, a ta usługa internetowa pobierze wszystkich użytkowników wraz z ich znajomości.

Na początku moja strona zostanie załadowana, ale potem moja strona nie zostanie odświeżona, a nowi użytkownicy powinni zostać wyświetleni, a nowe połączenia powinny być połączone z połączeniem AJAX z moją usługą sieciową.

Ale z prośbą o ajax wszystko jest popsute. To jest JSBin I have created.

Wyjście Dostaję:

enter image description here

Mam tylko 4 użytkowników i 3 połączenia jak widać w moim wyjściu JSBin to powinno być tylko 4 prostokąty i nie jestem dodanie większej liczby użytkowników, ale nadal uzyskiwanie tego niechlujnego wyjścia.

Źródło Kod referencyjny: Reference Fiddle

Próbuję uzyskać dane wyjściowe, jak pokazano na powyższym skrzypce, ale nie dostaję.

Oczekiwany wyjście: 4 prostokąty z animacją

Updated Js bin Demo: Updated JSBin

Z wyżej zaktualizowanym JSBin jestem coraz to wyjście, ale nie są one ruchomej (animacja nie działa):

Updated Output

+1

Czy usuwasz płótno między losowaniem? Wygląda na to, że dane wyjściowe z prostokątów będą występować między każdą aktualizacją. – DBS

+0

@DBS, możesz rozwinąć –

+1

Kiedy narysujesz coś na płótnie, poprzedni obraz pozostanie widoczny, chyba że samodzielnie wyczyścisz płótno. Tak więc wielokrotne narysowanie jednego z twoich identyfikatorów może wyglądać jak wiele kwadratów. Pomyśl o tym, jak dodawać nowe kwadraty do tego samego obrazu, zamiast tworzyć nowy obraz. Spróbuj wyczyścić go po uzyskaniu prośby o ajax, zanim narysujesz nowe kwadraty. – DBS

Odpowiedz

5

skrzynki nie są w ruchu, ponieważ kod fo r ich przenoszenie nigdy nie jest wywoływane.

Po przeniesieniu części animującej pola z updateUsers() do głównej pętli animacji będą animowane.

przesunąć punkt z tej strony:

function updateUsers() { 
    fetchData(); 

    // this part ------------------------------------------------------ 
    $.each(users, function(index, user) { 
    if (user.x <= 0) user.dir.x = 1; 
    if (user.x + user.width > canvas.width) user.dir.x = -1; 
    if (user.y <= 0) user.dir.y = 1; 
    if (user.y + user.height > canvas.height) user.dir.y = -1; 

    user.x += user.dir.x; 
    user.y += user.dir.y; 
    }); 
    // to here -------------------------------------------------------- 

    //window.setTimeout(updateUsers, 1000/60); 
    window.setTimeout(updateUsers, 9000); 
} 

tutaj:

function drawUsers() { 
    ctx.clearRect(0, 0, canvas.width, canvas.height); 
    $.each(users, function(index, user) { 
    ctx.beginPath(); 
    ctx.rect(user.x, user.y, user.width, user.height); 
    ctx.strokeStyle = 'red'; 
    ctx.stroke(); 

    if (user.connections != null) { 
     user.connections.forEach(function(id) { 
     const other = users.find(user => user.id === id); 

     ctx.beginPath(); 
     ctx.moveTo(user.x + (user.width/2), user.y + (user.height/2)); 
     ctx.lineTo(other.x + (other.width/2), other.y + (other.height/2)); 
     ctx.strokeStyle = 'black'; 
     ctx.stroke(); 
     }); 
    } 
    }); 

    // animate here 
    $.each(users, function(index, user) { 
    if (user.x <= 0) user.dir.x = 1; 
    if (user.x + user.width > canvas.width) user.dir.x = -1; 
    if (user.y <= 0) user.dir.y = 1; 
    if (user.y + user.height > canvas.height) user.dir.y = -1; 

    user.x += user.dir.x; 
    user.y += user.dir.y; 
    }); 
    window.requestAnimationFrame(drawUsers); 
} 

Ponieważ nie mamy dostępu do usługi internetowej, której używasz, i zakładając, że dane są poprawnie wrócił, miałem odkomentowac predefiniowanych danych, aby demo robocza:

Updated jsbin

+0

ok, testowałem twoje rozwiązanie, ale przy tworzeniu nowych połączeń tworzy inne duplikaty prostokątów. Jeśli chcesz, mogę podać mój adres URL usługi internetowej, aby zobaczyć rzeczywisty problem. –

+1

@Jeśli to pomoże, lub kilka zestawów z symulowanymi nowymi danymi, jeśli nie masz ochoty udostępniać go tutaj. – K3N

+1

Właściwie, gdy mam już 1 rekord połączenia w mojej bazie danych i kiedy go uruchomię, to działa dobrze, ale kiedy tworzę nowe połączenia w bazie danych, a moja prośba ajax pobiera te nowe połączenia, kiedy pojawia się problem. –

1

Pracowałem z Twojego Source Source Reference Fiddle, co działało całkiem dobrze.

Dodano kilka rzeczy:

pierwszy z funkcji oddzielnym dodać użytkownika do tablicy users. W ten sposób użytkownicy mogą być łatwo dodani po udanym wywołaniu usługi.

Po drugie, dodano kilka funkcji pomocnika, aby uzyskać losowe pozycje i wskazówki.

function addUser(user) { 
    users.push({ 
    id: user.UserId, 
    connections: user.Connections, 
    width: 80, 
    height: 80, 
    x: getRandomX(), 
    y: getRandomY(), 
    dir: { 
     x: getDir(), 
     y: getDir() 
    } 
    }); 
} 

// the success callback from your webservice 
// guess this receives a `user` object with Id and Connections 
// for the test we use `getRandomConnections` 
function getDataFromWebService() { 
    let newUser = { "UserId": Date.now(), "Connections": getRandomConnections() }; 
    addUser(newUser); 
} 

Fiddle

Po podłączeniu usługa, można rów funkcję getRandomConnections i odniesienie. W swojej Zestawienie sukces zwrotnego, upewnij się, że obiekt w formacie:

{ UserId: 1337, Connections: [1, 2] } 

przepustkę tego obiektu do funkcji addUser.

+0

, jeśli masz URL usługi internetowej, to co należy usunąć z kodu i czego użyć? –

+1

Zaktualizowałem moją odpowiedź – Pimmol

+0

czy mogę prosić o jakieś sugestie? –