2017-09-01 13 views
0

GoogleマップAPIを使用してマップを作成しています。 JavaScriptとknockout.jsがコーディングに使用されます。 私はasynchonously非同期追加することにより、GoogleマップAPIスクリプトをロードしようとするたび:キャッチされないにReferenceError:バインディング「の値を処理することができません:私は、このエラーenter image description hereGoogleマップからの非同期リクエストapi - バインディングエラーを処理できません

エラーが言うに取得

<script src async ="https://maps.googleapis.com/maps/api/js?v3.exp"></script> 

OR 

    <script async src="https://maps.googleapis.com/maps/api/js? 
    key=YOUR_API_KEY&callback=googleSuccess" onerror="googleError()"> 
    </script> 

機能(){リターンをpointFilter} " メッセージ:pointFilterは定義されていません しかし、私はpointFilter observableを定義しました。

リクエストから非同期を削除すると、ページは正常に実行されます。 このエラーを取り除くにはどうすればよいですか、これを行う方法が他にありますか。 これらは私のファイルindex.htmlとmain.jsです
単語の制限のために完全なコードを含めることはできません。

index.htmlを

<!DOCTYPE html> 
    <!--[if lt IE 7]>  <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <! 
    [endif]--> 
    <!--[if IE 7]>   <html class="no-js lt-ie9 lt-ie8"> <![endif]--> 
    <!--[if IE 8]>   <html class="no-js lt-ie9"> <![endif]--> 
    <!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--> 
    <head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <title>New Delhi</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <!-- CSS links--> 
    <link rel="stylesheet" href="css/main.css"> 
    <!-- JS links --> 
    <script src="js/vendor/modernizr-2.6.2-respond-1.1.0.min.js"></script> 
    <link rel="shortcut icon" href="favicon.ico" /> 
    <script> 
     window.jQuery || document.write('<script src="js/vendor/jquery- 
    1.11.2.min.js">\x3C/script>') 
    </script> 
    <!-- google maps api call--> 
    <script src async ="https://maps.googleapis.com/maps/api/js?v3.exp"> 
    </script> 
    <script src="js/vendor/knockout-3.2.0.js"></script> 
    <script src="js/main.js"></script> 

    </head> 
    <body> 
    <!--the map element will be used here and fill 100% of the screen--> 
    <div id="map"></div> 
    <!--this holds our entire listbox and search it will be added to map 
    controls--> 
    <div id="searchui"> 
     <!--is the checkbox options above the filter/search box--> 
     <div id="searchOptions" > 
      <label class="optionCheck"><input type="checkbox" 
    id="refitFilterCheck" data-bind="checked: refitFilterCheck"><span>refit 
    map on filter?</span></label> 
      <label class="optionCheck"><input type="checkbox" 
    id="refitResizeCheck" data-bind="checked: refitResizeCheck"><span>refit 
    map on window resize?</span></label> 
      <label class="optionCheck"><input type="checkbox" 
    id="searchCategoryCheck" data-bind="checked: searchCategoryCheck"> 
    <span>search name only?</span></label> 
     </div> 
     <!--this is the filter/search box--> 
     <input id="searchbox" type="search" placeholder="Search Here" data- 
    bind="value: pointFilter, valueUpdate: 'keyup'" autocomplete="off"> 
     <!--this is the points list--> 
     <ul id="pointList" data-bind="visible: listVisible, template: {name: 
    'pointsTemplate',foreach: shownList}"> 
     </ul> 
     <!--this is the list controls such as next page and collaps--> 
     <div id="listControls"> 
      <div id="pageControls" data-bind="display: listVisible"> 
       <div id="prevPage" data-bind="click: 
     changePage.bind($data,-1)"> 
        <strong data-bind="text: prevPageText"></strong> 
       </div> 
       <div id="pageNumText" data-bind="html: pageText"></div> 
       <div id="nextPage" data-bind="click: 
     changePage.bind($data,1)"> 
        <strong data-bind="text: nextPageText"></strong> 
       </div> 
      </div> 
      <div id="listRollup" data-bind="click: toggleList"> 
       <img id="rollupImg" data-bind="attr:{src: rollupIconPath, 
     alt: rollupText}" /> 
      </div> 
     </div> 


    </div> 

    <!--this is a knockout template used for point list items--> 
    <script type="text/html" id="pointsTemplate"> 
     <li data-bind="event: {mouseover: $parent.mouseHere, mouseleave: 
     $parent.mouseGone}, click:$parent.selectPoint, css: 
    $parent.getStyle($data)"> 
     <strong data-bind="text: name"></strong> 
     </li> 
    </script> 

    </body> 
    </html> 

main.js

var TheMap = function(){ 

this.Zoom = 10; 
this.mapOptions = { 
    zoom: this.Zoom, 
    panControl: false, 
    disableDefaultUI: true, 
    center: new google.maps.LatLng(28.6562,77.2410), 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 

this.map = 
    new google.maps.Map(document.getElementById('map'), this.mapOptions); 
    }; 

    var viewModel = function(){ 
/* scope alias */ 
var self = this; 
/* clear session storage any time we load */ 
sessionStorage.clear(); 
/* how many items to show in filtered list max? */ 
/* sets based on window height to always fit a clean amount (min 1) */ 
self.maxListNum = 
    ko.observable(Math.max(1,Math.ceil(($(window).height() -150)/30))); 
//is the list visible right now? 1 = on, 0 = false; 
self.listVisible = ko.observable(1); 
/* which point is the first one on our list page right now? 
* actual page is calculated from this. Storing point instead 
* of page so that point can remain consistent when list resizes 
*/ 
    self.listPoint = ko.observable(1); 

/* make sure the google map api loaded before we do any work */ 
    if (typeof google !== 'object' || typeof google.maps !== 'object'){ 
    console.log("error loading google maps api"); 
    $('#searchbox').val("Error Loading Google Maps Api"); 
    $('#searchbox').css({'background-color' : 'rgba(255,0,0,0.3)'}); 
    //return early since we have no maps. No point in doing much else. 
    return; 
    } 

pointFilter宣言:

 self.pointFilter = ko.observable(''); 

/* calculated array containing just the filtered results from points()*/ 
self.shownPoints = ko.computed(function() { 
    return ko.utils.arrayFilter(self.points(), function(point) { 
      return (self.pointFilter() === '*' || 
       point.name.toLowerCase().indexOf(self.pointFilter(). 
        toLowerCase()) !== -1); 
    }); 
    }, self); 
+0

あなたの質問にエラーメッセージを追加して、他のユーザーがGoogleの検索で見つけられるようにしてください。あなたが得ているエラーは、 "pointFilter"が定義されていないということです。あなたのビューモデルには含まれていません。コードの関連部分を更新してください。 –

+0

私は自分の質問を編集し、 "pointFilter"を宣言した部分を追加しました。 –

+0

「value:function(){return pointFilter}」という綴りがありますか?あなたが投稿したページの部分には、 "value:pointFilter"しかありません... –

答えて

0

あなたはおそらく、あなたのAPIキーに問題があります。 googleのAPIキーを作成して、コードYOU_API_KEYに置き換えたばかりのキーを作成することができます。

しかし、すでにキーをお持ちの場合は、コールバック関数でエラーが発生している可能性があります。あなたがコールバック関数を表示しないので、私はこの点についてお手伝いできません。 APIキーがある場合は、コールバック関数を表示してください。

質問がありましたら教えてください。

関連する問題