Javascript 嵌套在ng repeat中的指令中的未定义属性值
我对angular是个新手,我一直在努力寻找解决这个问题的方法,但我似乎还没有完全弄明白 我有Javascript 嵌套在ng repeat中的指令中的未定义属性值,javascript,angularjs,google-maps,ng-repeat,directive,Javascript,Angularjs,Google Maps,Ng Repeat,Directive,我对angular是个新手,我一直在努力寻找解决这个问题的方法,但我似乎还没有完全弄明白 我有myRating指令,它嵌套在ng repeat中,嵌套在google maps api指令中,html如下: <ui-gmap-google-map center='map.center' zoom='map.zoom'> <ui-gmap-search-box template="searchbox.template" events="searchbox.events"&g
myRating
指令,它嵌套在ng repeat
中,嵌套在google maps api指令中,html如下:
<ui-gmap-google-map center='map.center' zoom='map.zoom'>
<ui-gmap-search-box template="searchbox.template" events="searchbox.events"></ui-gmap-search-box>
<ui-gmap-marker ng-repeat="marker in markers" click="marker.click" coords="marker" idKey="$index" icon="marker.icon"
events="marker.events">
<ui-gmap-window isIconVisibleOnClick="true" show="marker.showWindow" zIndex="">
<p class="gm-tooltip">
<a class="gm-name" href="{{marker.url}}">
{{marker.name}}<br>
<my-rating rating-value="marker.rating" max="5" read-only="true"></my-rating>
</a>
</p>
</ui-gmap-window>
</ui-gmap-marker>
指令代码:
angular.module('foodMap.directives')
.directive('myRating', function () {
return {
restrict: 'E',
template: '<div class="rating" ng-class="{readonly: readOnly}">' +
'<span ng-repeat="star in stars" class="star {{star.reverseIndex}}" ng-class="{fullstar: star.reverseIndex==ratingValue}" ng-click="toggle(star.reverseIndex, $event)"></span>' +
'</div>',
scope: {
ratingValue: '=',
max: '=',
readOnly: '@'
},
link: function (scope, element, attrs) {
scope.stars = [];
for (var i = scope.max; i > 0; i--) {
scope.stars.push({reverseIndex: i});
}
scope.toggle = function (reverseIndex, event) {
if (scope.readOnly)
return;
scope.ratingValue = reverseIndex;
//jQuery to remove
$('.star').removeClass('fullstar');
$(event.target).toggleClass('fullstar');
};
}
}
});
angular.module('foodMap.directives'))
.指令('myRating',函数(){
返回{
限制:'E',
模板:“”+
'' +
'',
范围:{
额定值:'=',
最大值:'=',
只读:“@”
},
链接:函数(范围、元素、属性){
scope.stars=[];
对于(var i=scope.max;i>0;i--){
scope.stars.push({reverseIndex:i});
}
scope.toggle=函数(反向索引,事件){
if(scope.readOnly)
回来
scope.ratingValue=反向索引;
//要删除的jQuery
$('.star').removeClass('fullstar');
$(event.target).toggleClass('fullstar');
};
}
}
});
控制器
angular.module('foodMap.controllers')
.controller('MainCtrl', [
'$scope',
'bites',
function ($scope, bites) {
$scope.bites = bites.bites;
$scope.map = {
center: {
latitude: 51.5286416,
longitude: -0.1015987
},
zoom: 11
};
$scope.markers = [];
var createMarker = function (bite){
var marker = {
latitude: bite.location[0],
longitude: bite.location[1],
name: bite.name,
address: '',
icon: 'images/markers/restaurant.png',
url: '/#/bites/' + bite._id,
rating: bite.rating,
showWindow: false,
click: function() {
//not sure if this is the best solution
_.each($scope.markers, function(marker) {
marker.showWindow = false;
});
marker.showWindow = true;
}
}
$scope.markers.push(marker);
}
for (var i = 0; i < $scope.bites.length; i++){
createMarker($scope.bites[i]);
}
var events = {
places_changed: function (searchBox) {
var places = searchBox.getPlaces();
if (places) {
var lat = places[0].geometry.location.lat();
var lng = places[0].geometry.location.lng();
$scope.map.center.latitude = lat;
$scope.map.center.longitude = lng;
var address = places[0].address_components[0] && places[0].address_components[0].short_name || '';
var marker = {
latitude: lat,
longitude: lng,
name: places[0].name,
address: address,
icon: 'images/markers/star-3.png',
url: '/#/bites/',
rating: 5,
showWindow: true
}
$scope.markers.push(marker);
$scope.map.zoom = 15;
}
}
}
$scope.searchbox = { template:'searchbox.tpl.html', events: events };
}
]);
angular.module('foodMap.controllers'))
.controller('MainCtrl'[
“$scope”,
"咬",,
功能($scope,bites){
$scope.bites=bites.bites;
$scope.map={
中心:{
纬度:51.5286416,
经度:-0.1015987
},
缩放:11
};
$scope.markers=[];
var createMarker=函数(bite){
变量标记={
纬度:比特。位置[0],
经度:bite.location[1],
name:bite.name,
地址:'',
图标:“images/markers/restaurant.png”,
网址:'/#/bites/'+bite.\u id,
评级:咬。评级,
showWindow:false,
单击:函数(){
//不确定这是否是最好的解决方案
_.each($scope.markers,函数(marker){
marker.showWindow=false;
});
marker.showWindow=true;
}
}
$scope.markers.push(marker);
}
对于(变量i=0;i<$scope.bites.length;i++){
createMarker($scope.bites[i]);
}
var事件={
更改位置:功能(搜索框){
var places=searchBox.getPlaces();
若有(地方){
var lat=places[0]。geometry.location.lat();
var lng=places[0]。geometry.location.lng();
$scope.map.center.latitude=lat;
$scope.map.center.longitude=lng;
var address=places[0]。address_-components[0]和&places[0]。address_-components[0]。短_-name | |“”;
变量标记={
纬度:纬度,
经度:液化天然气,
名称:地点[0]。名称,
地址:地址:,
图标:“images/markers/star-3.png”,
url:“/#/bites/”,
评级:5,
橱窗:真的吗
}
$scope.markers.push(marker);
$scope.map.zoom=15;
}
}
}
$scope.searchbox={模板:'searchbox.tpl.html',事件:事件};
}
]);
所以问题是,目前我的数据库中有3个标记
,并且ng repeat
在集合中循环了两次,所以myRating
指令被调用了6次。当Iconsole.log(ratingValue)
时,在第一次循环中,值是正确的,但在第二次循环中,所有ratingValue
值都是未定义的
根据我所做的所有研究,据我所知,angular执行脏检查以找出发生了什么变化,这就是为什么有两个循环?但我不明白为什么我会丢失在第一个循环中正确绑定的这些值
对不起,我希望这足够清楚,我将感谢任何指点 你会尝试使用ng repeat和track by吗?你需要为每颗星都有一个唯一的属性,比如名字或id。这样的话,angular应该跳过脏检查。请看本页的“跟踪和复制”:谢谢你,因为!不幸的是,这并没有改变任何事情,它仍然在集合中循环两次(我只是想澄清我指的是标记
集合),并且仍然返回未定义
的ratingValue
属性