7

我想創建一個谷歌地圖信息窗口中的鏈接,使用角谷歌,地圖模塊的ui-gmap-windows如何將ui-gmap-windows InfoWindow/Marker的值傳遞給ui-sref?

在我的HTML模板,我有:

<ui-gmap-google-map center='main.map.center' zoom='main.map.zoom' options='main.map.options'> 
    <ui-gmap-markers models="main.markers" coords="'self'" icon="'icon'" options="'options'" click="'onClick'" fit="true"> 
     <ui-gmap-windows show="'showWindow'" closeClick="'closeClick'" ng-cloak> 
      <div class="mapinfowindow" data-ui-sref="display({id: id})">                  
       <span class="itemname" data-ng-non-bindable>{{ title }}</span> 
      </div> 
     </ui-gmap-windows> 
    </ui-gmap-markers> 
</ui-gmap-google-map> 

在我的控制,我有:

uiGmapGoogleMapApi.then(function(maps) { 
    vm.itemlist = search.getItemList();                             
    var markers = []; 
    _.each(vm.itemlist,function(item){ 
    search.getGeometry(item.href).then(function(marker) { 
     marker.title  = item.en; 
     marker.id   = item.href; 
     marker.showWindow = false; 
     marker.options = { 
          title: item.en, 
          icon: markericon.normal 
          }; 
     marker.onClick = function() { vm.markerClick(marker); }; 
     marker.closeClick = function() { vm.markerCloseClick(marker); }; 
     markers.push(marker); 
    }); 
    }); 
    vm.markers = markers; 
}); 

注意,我使用了 '控制器' 的語法,所以控制器中的vm.markers在html模板中顯示爲main.markers

我看到的問題是,在HTML中的data-ui-sref="display({id: id})"改變狀態到「顯示」頁面,但通過id推爲$ stateParams值,這顯然是不好的,因爲我不知道要顯示什麼..

我有另一個鏈接到同一頁面,信息窗口之外創建的(在結果列表),以及確實擠過id的值:

<div data-ng-repeat="entry in main.itemlist"> 
    <div data-ui-sref="display({id: entry.id})"> 

獲得I的任何幫助非常感謝nfoWindow的鏈接工作。

+0

您可以使用一個工廠,以保持$位置PARAMS才能,或創建一個過濾器/裝飾,每一個狀態改變發生。 – irth 2014-12-05 06:44:49

+0

您是否確認'id'是在'.mapinfowindow'範圍內定義的?在'span'中添加'{{id}}'或者其他東西,看它是否可用。 – mjtko 2014-12-05 10:15:18

+0

除非我把它放在'ng-non-bindable'中,否則''範圍內的任何東西都不可用。但是,如果我設置了'ng-non-bindable',我不能使用'ui-sref'中的值... O_o – egeland 2014-12-05 16:54:56

回答

12

這裏是我結束瞭解決這一問題的基礎上,https://github.com/angular-ui/angular-google-maps/issues/884發現信息:

我創建了信息窗口的模板和單獨的控制器,並改變了我的HTML:

<ui-gmap-google-map center='main.map.center' zoom='main.map.zoom' options='main.map.options'> 
    <ui-gmap-markers models="main.markers" coords="'self'" icon="'icon'" options="'options'" click="'onClick'" fit="true"> 
     <ui-gmap-windows show="'showWindow'" closeClick="'closeClick'" templateUrl="'templateUrl'" templateParameter="'templateParameter'" ng-cloak> 
     </ui-gmap-windows> 
    </ui-gmap-markers> 
</ui-gmap-google-map> 

由於你可以看到,現在有兩個新的參數:templateUrltemplateParameter

在主控制器,我的信息,我需要爲模板飼料:

... 
marker.templateUrl = templateUrl; 
marker.templateParameter = { 
          id: item.id, 
          title: item.name, 
          href: item.href, 
          img: vm.lookup_extphoto[item.href] //getting a photo externally 
          }; 
... 

在信息窗口的模板,我有:

<div data-ng-controller="infowindowTemplateController"> 
    <div class="mapinfowindow" data-ui-sref="display({id: parameter.id})"> 
     <div class="previewimage-container"> 
      <img data-ng-attr-src="{{:: parameter.img }}"> 
     </div> 
     <span>{{:: parameter.title }}</span> 
    </div>   
</div> 

的infowindowTemplateController本身是相當多的空:

(function(){ 
    'use strict'; 

    angular 
     .module('myapp') 
     .controller('infowindowTemplateController', infowindowTemplateController); 

     infowindowTemplateController.$inject=['$scope']; 
     function infowindowTemplateController ($scope) { 
     } 
})(); 
2

如果id是作用於.mapinfowindow範圍之內絕對可以,你可以嘗試:

<div class="mapinfowindow" data-ui-sref="display({id: '{{id}}'})"> 

(來源:https://github.com/angular-ui/ui-router/issues/395#issuecomment-59136525

如果不工作,你可能需要一個定製指令。

+0

關閉 - 此工作,並且您不需要單引號: ''data-ng-non-bindable'好像不是可綁定的數據需要。 – egeland 2014-12-05 16:42:35

+0

實際上,現在我已經測試了它 - id確實出現在html源代碼中,但ui-sref不會觸發,可能是因爲非常相同的非綁定參數。 – egeland 2014-12-05 16:49:37

+1

一個可能的解決方案,我是現在看看:https://github.com/angular-ui/angular-google-maps/issues/884 – egeland 2014-12-05 17:03:53

2

使用$parent來獲得該值。

模板:

<ui-gmap-marker ng-repeat="marker in markers" 
        coords="marker.coords"> 
    <ui-gmap-window ng-cloak> 
     <a ui-sref="details({ id : $parent.marker.id })">Go!</a> 
    </ui-gmap-window> 
</ui-gmap-marker> 

控制器:

for (var i = 0; i < mArray.length; i++) { 
    var marker = { 
     id   : mArray[i]._id, 
     coords  : { 
      latitude : mArray[i].address.latitude, 
      longitude : mArray[i].address.longitude 
     } 
    }; 
    $scope.markers.push(marker); 
}