2016-03-29 10 views
-1

Konnte jemand Hilfe mein Code überprüfen, ich versuche, die automatische Vervollständigung während der Eingabe einer Eingabe einzurichten, scheint aber nicht zu funktionieren: Die Konsole zeigt keinen Fehler, aber die automatische Vervollständigung würde einfach nicht funktionieren.Autocomplete in Karte mit Knockout

Hier ist der Code:

var mapApplication = function(){ 

    var mapsModel = { 
     fromAddress: ko.observable(), 
     toAddress: ko.observable() 
    }; 
    // method to add custom binding handler to the KO 
    var configureBindingHandlers = function(){ 
     // custom binding for address auto complete 
     ko.bindingHandlers.addressAutoComplete = { 
      init: function(element, valueAccessor){ 
      //create autocomplete object 
      var autocomplete = new google.maps.places.Autocomplete(element, {types:['geocode']}); 
      // when user selects an address from the drop down, populate the address in the model. 
      var value = valueAccessor(); 
      google.maps.event.addListener(autocomplete, 'place_changed', function(){ 
       var place = autocomplete.getPlace(); 
       console.log(place); 
       value(place); 
      }); 
      } 
     }; 
    }; 

    var init = function(){ 
     // add code to initialise the module 
     ko.applyBindings(mapApplication); 
    }; 

    // execute the init function when the DOM is ready 
    $(init); 

    return { 
     // add member that will be exposed publicly 
     mapsModel: mapsModel 
    }; 
}(); 

und die HTML:

<div class="panel-heading">Address</div> 
<div class="panel-body"> 
    <div id="addressFromFields" class="form-group"> 
    <label for="autocompleteFromAddress"> From Address</label> 
    <input id="autocompleteFromAddress" class="form-control" data-bind="addressAutoComplete: mapApplication.mapsModel.fromAddress" placeholder="where are u from" type="text"> 
    </div> 

    <div id="addressToFields" class="form-group"> 
    <label for="autocompleteToAddress"> From Address</label> 
    <input id="autocompleteToAddress" class="form-control" data-bind="addressAutoComplete: mapApplication.mapsModel.toAddress" placeholder="where are you going" type="text"> 
    </div> 
</div> 
+0

Können Sie das konkretisieren, was Sie unter „funktioniert nicht“? Wird Ihr Callback für den Autocomplete-Listener aufgerufen? –

Antwort

0

Wenn Sie ko.applyBindings(mapApplication), der Name mapApplication nicht innerhalb Knockout beibehalten. Sein Inhalt wird das Objekt $data, der Kontext der obersten Ebene, den Sie normalerweise nicht namentlich verwenden, das ist impliziert. B.

data-bind="addressAutoComplete: mapsModel.toAddress" 
+0

Hey, danke, dass du dir die Zeit genommen hast zu antworten, aber ich habe die Idee ausprobiert, die du vorgeschlagen hast, aber es funktioniert nicht .... Was denkst du? – Demmy

+0

Ich weiß es nicht. Die Konstruktion ist für meine Augen etwas verwirrend, und es gibt keine Geige zum Spielen. Sie müssen nur durchgehen und sehen, ob die Dinge das sind, was Sie von verschiedenen Punkten erwarten. –

+0

Riefst du 'configureBindingHandlers' an? Es sieht nicht so aus. –

0

Hier ist ein Schnipsel mit Ihrem Code drin. Ich habe die Definition des Bindinghandlers weggelassen, weil sie nicht erstellt wurde und nicht wirklich Teil Ihres Viewmodel-Codes ist, sondern eine Erweiterung von Knockout.

Der Fehler, den ich an dieser Stelle zu bekommen ist, dass es nicht so etwas wie google.maps.places ist

ko.bindingHandlers.addressAutoComplete = { 
 
    init: function(element, valueAccessor) { 
 
    console.debug('GMP', google.maps); 
 
    //create autocomplete object 
 
    var autocomplete = new google.maps.places.Autocomplete(element, { 
 
     types: ['geocode'] 
 
    }); 
 
    console.debug("Autocomplete:", autocomplete); 
 
    // when user selects an address from the drop down, populate the address in the model. 
 
    var value = valueAccessor(); 
 
    google.maps.event.addListener(autocomplete, 'place_changed', function() { 
 
     var place = autocomplete.getPlace(); 
 
     console.log(place); 
 
     value(place); 
 
    }); 
 
    } 
 
}; 
 

 
var mapApplication = function() { 
 

 
    var mapsModel = { 
 
    fromAddress: ko.observable(), 
 
    toAddress: ko.observable() 
 
    }; 
 

 
    var init = function() { 
 
    // add code to initialise the module 
 
    ko.applyBindings(mapApplication); 
 
    }; 
 

 
    // execute the init function when the DOM is ready 
 
    $(init); 
 

 
    return { 
 
    // add member that will be exposed publicly 
 
    mapsModel: mapsModel 
 
    }; 
 
}(); 
 

 
console.debug("What is going on?");
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" /> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?v=3&amp;sensor=false"></script> 
 

 
<div class="panel-heading">Address</div> 
 
<div class="panel-body"> 
 
    <div id="addressFromFields" class="form-group"> 
 
    <label for="autocompleteFromAddress">From Address</label> 
 
    <input id="autocompleteFromAddress" class="form-control" data-bind="addressAutoComplete: mapApplication.mapsModel.fromAddress" placeholder="where are u from" type="text"> 
 
    </div> 
 

 
    <div id="addressToFields" class="form-group"> 
 
    <label for="autocompleteToAddress">From Address</label> 
 
    <input id="autocompleteToAddress" class="form-control" data-bind="addressAutoComplete: mapApplication.mapsModel.toAddress" placeholder="where are you going" type="text"> 
 
    </div> 
 
</div>