2016-03-29 3 views
-1

Может ли кто-нибудь помочь проверить мой код, я пытаюсь настроить автозаполнение при вводе ввода, но, похоже, не работает: консоль не показывает ошибки, но автозаполнение просто не работает.Autocomplete in Map с использованием нокаута js

Вот код:

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

и 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

Можете ли вы быть более конкретными о том, что вы имеете в виду под «не работает»? Вызывается ли ваш обратный вызов для прослушивателя автозаполнения? –

ответ

0

Когда вы ko.applyBindings(mapApplication), имя mapApplication не удерживается внутри Knockout. Его содержимое становится объектом $data, контекстом верхнего уровня, который вы обычно не используете по имени, это подразумевается. Таким образом, ваши привязки должны быть, например,

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

Эй, благодарю за то, что нашли время, чтобы ответить, но я попробовал идею, которую предложил, но это не работает ... как вы думаете? – Demmy

+0

Не знаю. Конструкция немного запутанна для моих глаз, и нет никакой скрипки, чтобы играть. Вам просто нужно проследить его и посмотреть, не так ли, что вы ожидаете от них в разных точках. –

+0

Вы когда-нибудь называли 'configureBindingHandlers'? Это не похоже на это. –

0

Вот фрагмент кода с его кодом. Я вытащил определение bindinghandler, потому что он не создавался, и он не является частью вашего кода viewmodel, это расширение Knockout.

Я получаю ошибку в данный момент является то, что не существует такого понятия, как google.maps.places

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>