2017-12-04 20 views
1

비컨 컬렉션에지도에 표시하고 싶은 컬렉션이 있습니다. 그들의 위치가 응용 프로그램의 모든 인스턴스간에 동기화되기를 원합니다.Parse LiveQuery Subscription은 항상 이전 버전을 수신합니다.

즉, 비컨을 다른 위치로 이동하면이 변경 사항이 다른 애플리케이션 인스턴스에 반영되기를 원합니다.

Parse javascript SDK 버전 1.11.0을 사용합니다.

var Baliza = Parse.Object.extend("Balizas"); 

    Baliza.prototype.show = function(){ 
     var self = this; 

     var start= '<div class="row" style="width: 350px;">\n' + 
      ' <div class="control-group" id="fields">\n' + 
      '  <label class="control-label" style="text-align: center;" for="field1">Introducir Mac Asociadas a Ese Punto</label>\n' + 
      '  <div class="controls">\n' + 
      '   <form id="form" role="form" autocomplete="off">'; 

     var tmp = ''; 

     tmp = tmp + '<div class="entry input-group col-xs-12">\n' + 
      '    <input class="form-control" name="fields[]" type="text" value="'+self.get("mac")[0]+'">\n' + 
      '    <span class="input-group-btn">\n' + 
      '    <button baliza-id='+self.id+' class="btn btn-success btn-add" type="button">\n' + 
      '    <span class="glyphicon glyphicon-plus"></span>\n' + 
      '    </button>\n' + 
      '    </span>\n' + 
      '   </div>'; 


     if (self.get("mac").length>1){ 
      for (var i=1; i<self.get("mac").length; i++) { 
       tmp = tmp + '<div class="entry input-group col-xs-12">\n' + 
        '    <input class="form-control" name="fields[]" type="text" value="'+self.get("mac")[i]+'">\n' + 
        '    <span class="input-group-btn">\n' + 
        '    <button baliza-id='+self.id+' class="btn btn-remove col-xs-12" type="button">\n' + 
        '    <span class="glyphicon glyphicon-minus"></span>\n' + 
        '    </button>\n' + 
        '    </span>\n' + 
        '   </div>'; 
      } 
     } 

     var end = '</form>\n' + 
      '   <br>\n' + 
      ' <button type="button" baliza-id='+self.id+' class="btn btn-block btn-info btn-sm ">Salvar</button>\n' + 
      ' <button type="button" baliza-id='+self.id+' class="btn btn-block btn-danger btn-sm ">Eliminar</button>\n' + 
      '  </div>\n' + 
      ' </div>\n' + 
      '</div>'; 

     //console.log('impirmiendo marker'); 
     //console.log(this.marker); 

     console.log("Localización -> ", self.get("localizacion")); 

     if(self.marker != null) { 
      self.marker.setLatLng(new L.LatLng(self.get("localizacion").latitude, self.get("localizacion").longitude),{draggable:'true'}); 
     } else { 

      self.marker = new L.marker([ self.get("localizacion").latitude, self.get("localizacion").longitude], { 
       icon: L.AwesomeMarkers.icon({icon: 'certificate', prefix: 'glyphicon', markerColor: 'blue'}), 
       draggable: 'true' 
      }).bindPopup("", {maxWidth: 560}); 

      self.marker.on('dragend', function(event){ 

       var position = event.target.getLatLng(); 

       console.log("Notify new Location -> ", position.lat, position.lng); 


       //Enviamos El Dato a Parse 
       this.set("localizacion", new Parse.GeoPoint(position.lat, position.lng)); 
       this.save(null, { 
        success: function (balizaSaved) { 
         console.log("Baliza Guardad con éxito: ", balizaSaved); 

        }, 
        error: function (baliza, error) { 
         alert('Failed to create new object, with error code: ' + error.message); 
        } 
       }); 
      }.bind(this)); 

      map.addLayer(self.marker); 
     } 

     self.marker.getPopup().setContent(start+tmp+end); 


    }; 

지도에서 위치의 변화를 알리는 담당하는 코드는 다음과 같습니다 :

I는 서버에 저장 컬렉션의 각 개체를 나타내는 다음 구문 분석 모델을 정의

self.marker.on('dragend', function(event){ 

       var position = event.target.getLatLng(); 

       console.log("Notify new Location -> ", position.lat, position.lng); 


       //Enviamos El Dato a Parse 
       this.set("localizacion", new Parse.GeoPoint(position.lat, position.lng)); 
       this.save(null, { 
        success: function (balizaSaved) { 
         console.log("Baliza Guardad con éxito: ", balizaSaved); 

        }, 
        error: function (baliza, error) { 
         alert('Failed to create new object, with error code: ' + error.message); 
        } 
       }); 
      }.bind(this)); 

구독이 다음과 같이 생성되었다

var query = new Parse.Query(Baliza); 
var subscription = query.subscribe(); 


var mapaBalizasParse = new Map(); 

// After specifying the Monster subclass... 
//Parse.Object.registerSubclass('Balizas',Baliza); 

subscription.on('create', function (balizaCreated) { 
    console.log("New baliza created -> ", balizaCreated.toJSON()); 
    var baliza = new Baliza(balizaCreated.toJSON()); 
    baliza.show(); 
    mapaBalizasParse.set(baliza.id, baliza); 
}); 


subscription.on('update', function (balizaSaved) { 
    console.log('BALIZA ACTUALIZADA -> ', balizaSaved.toJSON()); 
    var baliza = mapaBalizasParse.get(balizaSaved.id); 
    baliza.set("mac", balizaSaved.get("mac")); 
    baliza.set("localizacion", balizaSaved.get("localizacion")); 
    baliza.show(); 
}); 

subscription.on('delete', function (baliza) { 
    //console.log(mapaBalizasParse.get(baliza.id)); 
    map.removeLayer(mapaBalizasParse.get(baliza.id).marker); 
    mapaBalizasParse.delete(baliza.id); 
}); 

subscription.on('leave', function (balizaLeave) { 
    console.log('Leave called -> ', balizaLeave.id, balizaLeave.get("localizacion")); 
}); 

subscription.on('enter', function (balizaCalled) { 
    console.log('Enter called -> ', balizaCalled.id, balizaCalled.get("localizacion")); 
}); 
01 다음과 같이

function onMapClick(e) { 
     var baliza = new Baliza(); 

     baliza.set("localizacion",new Parse.GeoPoint(e.latlng.lat, e.latlng.lng)); 
     baliza.set("mac",["11:22:33:44:55:10"]); 
     baliza.set("editando",true); 

     baliza.save(null, { 
      success: function(baliza) { 
       //Añadimos La Baliza Al Mapa Interno 
       //mapaBalizasParse.set(baliza.id,baliza); 
       //baliza.show(); 
      }, 
      error: function(baliza, error) { 
       alert('Failed to create new object, with error code: ' + error.message); 
      } 
     }); 
    } 

현재 등록 "비콘"의 목록이 표시됩니다 : 다음과 같이 나는지도상의 위치를 ​​클릭 23,516,

때마다 나는 비콘을 만들

query.find({ 
      success: function(results) { 
       console.log("Total Balizas -> " + results.length); 
       for (var i = 0; i < results.length; i++) { 
        var currentBaliza = results[i]; 
        console.log("Baliza " + i + " -> ", currentBaliza); 
        currentBaliza.show(); 
        mapaBalizasParse.set(currentBaliza.id, currentBaliza); 
       } 
      }, 
      error: function(error) { 
       console.log("Error: " + error.code + " " + error.message); 
      } 
     }); 

문제는 예를 들어 위치 (위도 : 40.961229844235234, 경도 : -5.669621229171753)에서지도의 다른 지점 (위도 : 40.9604196476232, 경도 : -5.6707102060318)으로 이동하면

응용 프로그램의개

다른 인스턴스가 업데이트 이벤트 객체의 이전 버전을받을 위치 필드는 변경되지 않았습니다 (위도 : 40.961229844235234, 경도 : -5.669621229171753)

누군가가 내가 '무엇을 말해 줄 수 코드에서 잘못하고있다.

미리 감사드립니다.

답변

1

나는 최소한의 구성으로 몇 가지 테스트를하고있다 그리고 이것은 내가 본 것입니다 :

을 콜백에서 맵이 코드를 사용 설정에있는 모든 비콘을로드하는 :

var beacon = new Baliza({id: baliza.id, localizacion: 
baliza.get("localizacion") , mac: baliza.get("mac"), editando: 
baliza.get("editando")}); 

을하지만 때를 '생성'이벤트의 콜백에서 만든 새로운 비콘을 추가, 당신은 사용이 하나 : 당신이 일 사용 당신이 비콘이 정상적으로 업데이트 첫 번째 코드를 사용하는 경우 만하면 내 테스트에서

var beacon = new Baliza(); 
beacon.id = baliza.id; 
beacon.localizacion = baliza.get("localizacion"); 
beacon.mac = baliza.get("mac"); 
beacon.editando = baliza.get("editando"); 

, 전자 두 번째, 비콘의 이전 버전은 자바 스크립트 콘솔에 기록됩니다.

오버로드 된 생성자에 포함되지 않은 특수한 것이 빈 생성자에서 발생하는 것처럼 보입니다.

도움이되기를 바랍니다. :) 여기

내 전체 코드 :

HTML

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Simple test parse JS</title> 

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
</head> 
<body> 


<input type="text" id="txtIndex" class="textbox" value="1"> 

<button type="button" class="btn-add">Add beacon</button> 
<button type="button" class="btn-modify">Modify beacon</button> 
<button type="button" class="btn-remove">Remove beacon</button> 



<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
<script src="http://chancejs.com/chance.min.js"></script> 
<script src="https://unpkg.com/[email protected]/dist/parse.min.js"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 

<!-- Own JS--> 
<script src="./js/demo_parse.js"></script> 

</body> 
</html> 

JS

var mapBeacons = new Map(); 
var query; 
var subscription; 
var Baliza; 


function loadAllBeacons(){ 

    query.find({ 
     success: function(results) { 
      for (var i = 0; i < results.length; i++) { 
       //Vamos Creando Los Objetos Que Recibimos 
       var beacon = new Baliza(); 
       beacon.id = results[i].id; 
       beacon.localizacion = results[i].get("localizacion"); 
       beacon.mac = results[i].get("mac"); 
       mapBeacons.set(beacon.id,beacon); 
      } 
     }, 
     error: function(error) { 
      console.log("Error: " + error.code + " " + error.message); 
     } 
    }); 
} 

function modifyBeacon(){ 

    var key = $("#txtIndex").val(); 
    var baliza = mapBeacons.get(key); 
    var my_chance = new Chance(); 
    var randomLocation = new Parse.GeoPoint(my_chance.latitude(), my_chance.longitude()) 
    baliza.set("localizacion",randomLocation); 

    baliza.save(null, { 
     success: function(baliza) { 
      // Execute any logic that should take place after the object is saved. 
      mapBeacons.set(baliza.id,baliza); 
     }, 
     error: function(baliza, error) { 
      // Execute any logic that should take place if the save fails. 
      // error is a Parse.Error with an error code and message. 
      alert('Failed to remove new object, with error code: ' + error.message); 
     } 
    }); 
} 

function removeBeacon(){ 

    var key = $("#txtIndex").val(); 
    var baliza = mapBeacons.get(key); 

    baliza.destroy({ 
     success: function(myObject) { 
      // The object was deleted from the Parse Cloud. 
      //map.removeLayer(baliza.marker); 
      //mapaBalizasParse.delete($(this).attr('id')); 
      console.log("Beacon removed sucessfully"); 
      console.log(myObject); 

     }, 
     error: function(myObject, error) { 
      // The delete failed. 
      // error is a Parse.Error with an error code and message. 
     } 
    }); 

} 

function addNewBeacon(){ 

    var baliza = new Baliza(); 
    var my_chance = new Chance(); 
    var randomLocation = new Parse.GeoPoint(my_chance.latitude(), my_chance.longitude()) 

    baliza.set("localizacion",randomLocation); 
    baliza.set("mac",["11:22:33:44:55:10"]); 
    baliza.set("editando",true); 

    baliza.save(null, { 
     success: function(baliza) { 
      console.log("OnSave Beacon saved sucessfully"); 
      console.log(baliza); 
     }, 
     error: function(baliza, error) { 
      alert('Failed to create new object, with error code: ' + error.message); 
     } 
    }); 

} 


$(function() { 

    console.log("ready!"); 

    //Init parse 
    Parse.initialize("6xuPkPgqEfCdzXwaxAfUuKbTAglJL5ALa1mmY8de"); 
    Parse.serverURL = 'http://encelocalizacion.com:1337/parse'; 

    //Objeto Ppara interacturar con el Objeto Baliza de Parser 
    Baliza = Parse.Object.extend("Balizas", { 
     /** 
     * Instance properties go in an initialize method 
     */ 
     id: '', 
     localizacion: '', 
     mac:'', 
     marker:'', 
     popup:'', 
     initialize: function (attr, options) { 

     } 
    }); 

    query = new Parse.Query(Baliza); 
    subscription = query.subscribe(); 


    // Subscription for create 
    subscription.on('create', function (baliza) { 

     // TODO CHANGE THIS 
     var beacon = new Baliza({id: baliza.id, localizacion: baliza.get("localizacion") , mac: baliza.get("mac"), editando: baliza.get("editando")}); 

     /* 
     var beacon = new Baliza(); 
     beacon.id = baliza.id; 
     beacon.localizacion = baliza.get("localizacion"); 
     beacon.mac = baliza.get("mac"); 
     beacon.editando = baliza.get("editando"); 
     */ 


     mapBeacons.set(beacon.id,beacon); 

     console.log("New beacon added to BBDD") 
     console.log(mapBeacons) 

    }); 

    // Subscription for update 
    subscription.on('update', function (kk) { 
     console.log('Updated beacon:' + kk.get("localizacion").latitude + " " + kk.get("localizacion").longitude + " " + kk.get("mac")+ " " + kk.get("id")); 
    }); 

    // Subscription for delete 
    subscription.on('delete', function (kk) { 
     mapBeacons.delete(kk.id); 
     console.log('Deleted beacon:' + kk.get("localizacion").latitude + " " + kk.get("localizacion").longitude + " " + kk.get("mac")); 
     console.log(mapBeacons) 
    }); 

    loadAllBeacons(); 

    $(document).on('click', '.btn-add', function(e) { 
     addNewBeacon(); 
    }).on('click', '.btn-remove', function(e) { 
     removeBeacon(); 
     return false; 
    }).on('click', '.btn-modify', function(e) { 
     modifyBeacon(); 
    }); 

});