Javascript 嵌套在ng repeat中的指令中的未定义属性值

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

我对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"></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次。当I
console.log(ratingValue)
时,在第一次循环中,值是正确的,但在第二次循环中,所有
ratingValue
值都是
未定义的

根据我所做的所有研究,据我所知,angular执行脏检查以找出发生了什么变化,这就是为什么有两个循环?但我不明白为什么我会丢失在第一个循环中正确绑定的这些值


对不起,我希望这足够清楚,我将感谢任何指点

你会尝试使用ng repeat和track by吗?你需要为每颗星都有一个唯一的属性,比如名字或id。这样的话,angular应该跳过脏检查。请看本页的“跟踪和复制”:谢谢你,因为!不幸的是,这并没有改变任何事情,它仍然在集合中循环两次(我只是想澄清我指的是
标记
集合),并且仍然返回
未定义
ratingValue
属性