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

时间:2015-06-16 20:55:34

标签: javascript angularjs google-maps ng-repeat directive

我是棱角分明的新手,我已经深入探索了这个问题的解决方案,但我似乎无法弄明白。

我的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.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 };

    }
]);

所以问题是目前我的数据库中有3个markers,而ng-repeat循环遍历集合两次,因此myRating指令被调用了6次。当我console.log(ratingValue)时,在第一个循环中,值是正确的,但是当它第二次循环时,所有ratingValue值都是undefined
从我所做的所有研究中,据我所知,angular执行脏检查以找出变化的原因,这就是为什么两个循环?但是我不明白为什么我会丢失在第一个循环中正确绑定的值。

对不起,我希望这很清楚,我会感激任何指点!

0 个答案:

没有答案