如何使用 Angular 指令 ng-click 和 ng-class 在传单标记弹出窗口中
How to use Angular directives ng-click and ng-class inside Leaflet marker popup
我正在使用Angular.JS和Leaflet.JS作为我所在位置的地图,该地图具有绑定弹出窗口的地图标记。我需要使用带有两个不同图标(一个显示在下面的代码中(的跨度,您可以单击它们来调用不同的函数,并在满足某些条件时使用 ng-class 来更改类。这是我的代码:
var marker = L.marker([51.5, -0.09], {icon: blueIcon}).bindPopup('<br><span ng-class="thumbsUpClass(' + hotelsSelectedDates[i]['hotels'][s] + ')" ng-click="addChoice(' + hotelsSelectedDates[i]['hotels'][s] + ',' + hotels + ')"><span class="popup-container"><span class="icon-stack thumbs-up-stack"><i class="icon-sign-blank icon-stack-base"></i><i class="icon-thumbs-up"></i></span></span></span>');
但是,当我检查元素时,我得到这个:
<span ng-class="thumbsUpClass([object Object])" ng-click="addChoice([object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object])"><span class="popup-container"><span class="icon-stack thumbs-up-stack"><i class="icon-sign-blank icon-stack-base"></i><i class="icon-thumbs-up"></i></span></span></span>
ng-click应该向该函数发送特定对象和对象数组,但是当我单击图标时没有任何反应。在我的研究中,我发现弹出窗口会阻止事件传播(更多信息,但我不确定如何覆盖它或修复以使其与 angular 一起使用。有人知道如何做到这一点吗?
更新:
由于 ng-click/class 计算一个字符串,我将变量固定为如下所示:
$scope.item = hotelsSelectedDates[i]['hotels'][s]
$scope.set = hotels
var marker = L.marker([51.5, -0.09], {icon: blueIcon}).bindPopup('<br><span ng-class="thumbsUpClass(item)" ng-click="addChoice(item,set)"><span class="popup-container"><span class="icon-stack thumbs-up-stack"><i class="icon-sign-blank icon-stack-base"></i><i class="icon-thumbs-up"></i></span></span></span>');
然后 html 正确出现:
<span ng-class="thumbsUpClass(item)" ng-click="addChoice(item,set)"><span class="popup-container"><span class="icon-stack thumbs-up-stack"><i class="icon-sign-blank icon-stack-base"></i><i class="icon-thumbs-up"></i></span></span></span>
但是,当我单击该图标时,没有任何反应,并且看起来不像正在调用函数。有人知道为什么会发生这种情况吗?
您的问题来自您正在手动创建一些 DOM,而这些 DOM 不是由 AngularJS 编译的。
在这些情况下,您必须手动编译和链接元素。
代码如下所示:
var html = '<br><span ng-class="thumbsUpClass(item)" ' +
'ng-click="addChoice(item,set)"><span class="popup-container"><span ' +
'class="icon-stack thumbs-up-stack"><i class="icon-sign-blank ' +
'icon-stack-base"></i><i class="icon-thumbs-up"></i></span></span></span>',
linkFunction = $compile(angular.element(html)),
newScope = $scope.$new();
newScope.item = hotelsSelectedDates[i]['hotels'][s]
newScope.set = hotels
var marker = L.marker([51.5, -0.09], {icon: blueIcon}).bindPopup(linkFunction(newScope)[0]);
在这里,我采用您的HTML字符串,首先将其转换为DOM。因为 AngularJS 吃的是 DOM,而不是字符串。
angular.element(html)
然后,我使用 $compile 服务将此 DOM 编译为链接函数。
linkFunction = $compile(angular.element(html));
执行时,此函数将返回一个完全由 Angular 控制的 jQuery DOM 树,在您作为参数提供给它的作用域中运行。这就是我在这里所做的
linkFunction(newScope)
请注意,我给出的范围是$scope的子范围。如果不这样做,您将在所有弹出窗口之间共享相同的范围,这不是一个好主意。创建新范围是在 var 声明中完成的
newScope = $scope.$new()
从中您可以获得实际的DOM节点
linkFunction(scope)[0]
并传递给传单
.bindPopup(linkFunction(newScope)[0]);
大功告成!
有关详细信息,请参阅编译器文档。
编辑:纠正有关范围的问题
您可以在 angular-leaflet-directive 中使用对 Angular 内容的新支持:
var html = '<br><span ng-class="thumbsUpClass(item)" ' +
'ng-click="addChoice(item,set)"><span class="popup-container"><span ' +
'class="icon-stack thumbs-up-stack"><i class="icon-sign-blank ' +
'icon-stack-base"></i><i class="icon-thumbs-up"></i></span></span></span>';
...
$scope.markers.push( { lat: ...,
lng: ...,
message: html,
getMessageScope: function() { return $scope; },
});
我发现这个答案对mapbox-gl-js和angular有帮助:
var html = '<button ng-click="fn()">Click Me</button>';
var compiledHtml = $compile(html)($scope);
var popup = new mapboxgl.Popup()
.setLngLat([-91.874, 42.760])
.setDOMContent(compiledHtml[0])
.addTo(map);
启用 ng 单击弹出窗口(地图框(
我研究了这种特殊类型的问题,以实例化针对弹出窗口内的单击的函数。我正在使用角度传单指令,我无法进行$compile,因为它已经在$compile内,并且会创建一个循环引用。我所做的是以下几点。
$scope.markers[$scope.asset_table[imc]['asset']['_id']['$oid']]={
lat:$scope.asset_table[imc]['last_data']['loc']['coordinates'][1],
lng:$scope.asset_table[imc]['last_data']['loc']['coordinates'][0],
focus:true,
message:"<h4>"+$scope.asset_table[imc]['asset']['name']+"</h4>
<span class='btn btn-danger'
onclick='detailView()';>View Details</span>",
//message: linkFunction, /*I discarded this as it was creating circular reference*/
icon: {
iconUrl: $scope.icon,
iconSize: [30, 30],
iconAnchor: [15, 15],
popupAnchor: [0, 0],
shadowUrl: $scope.icon,
shadowSize:[0,0],
iconAngle:$scope.asset_table[imc]['last_data']['bearing']
}
};
在此之下,函数 viewDetail(( 被调用
detailView = function(){
//alert("Test");
$rootScope.$broadcast('asset.details',$scope.asset_table);
}
所以我不得不在 angular 中使用传统的 javascript 来避免循环链接的复杂性。
我这个话题有点晚了,但我也有类似的情况,想分享我的解决方案。
假设您有一些要添加到弹出窗口中的 html,只需在其中添加一个"id"。
var html = '<a id="popup" href="" ng-model="featureSelected" ng-click="cherryPickPin(featureSelected)">cherry pick this pin</a>';
现在您需要做的就是:
var popupElement = $('#popup'); // grab the element (make sure that it exists in the DOM)
popupElement = $compile(popupElement)($scope); // let angular know about it
我之所以写这篇文章,是因为我正在 Ionic/Cordova 上寻找这个问题的解决方案(移动应用程序上的地图集成(。
问题是$compute函数似乎不起作用,因为它运行在精简版的jQuery上。因此,使其工作的唯一方法,显然也是最简单的方法是使用David提出的代码(非常感谢伙计!
在我的代码中,它看起来像这样:
$scope.map.markers[i] = {
lat: parseFloat(place.latitude),
lng: parseFloat(place.longitude),
message: htmlPopupContent,
getMessageScope: function() { return $scope; },
focus: true,
draggable: false
};
希望这能有所帮助!
- onClick 事件在表单标记中不起作用
- 如何在一个表单标记中验证多个字段集
- 如何在Rails表单标记中获取onclick属性
- 编辑gravityforms表单标记
- 在javascript中通过id获取元素,而页面上没有任何表单标记
- 验证不带表单标记的Html 5输入
- 离子谷歌地图标记窗口内容
- jQuery 中的表单标记值
- Ajax 不使用表单标记
- 如何在表单标记中调用非表单元素
- 在表单标记(HTML,JavaScript)中插入
- 表单标记内没有 jquery 事件正常工作
- 单击窗口关闭按钮时如何附加事件
- 单击窗口.位置,参数已传递
- 在输入表单标记中使用 onclick 属性时出现 JavaScript 未捕获的引用错误
- 如何将参数传递给在表单标记外部定义的 javascript 函数
- 获取选项 从其他选项中选择名称 选择不带表单标记的名称
- 如何将表单“传播”到引导面板的两个区域?(浏览器“修复”未关闭的表单标记)
- 如何验证没有表单标记的字段
- 当窗口已通过表单标记打开时,使用 javascript 关闭浏览器窗口