Angular ng-click错失了大量点击

时间:2016-05-25 20:40:11

标签: angularjs

在我的棋盘游戏角度应用程序中,我使用ng-click以这种方式触发卡片替换:

<div ng-repeat="card in hero.hand" class="col-xs-4 col-sm-2">
<div class="thumbnail" role="button" ng-click="play(card.id)"> <!-- nearly half of mouse clicks not processed -->
    <center>
        <h4>{{card.type}}</h4>
    </center>
    <img class="painting" ng-src="../gamedata/units/views/{{card.type}}.png" alt="" />
</div>

问题是点击事件不会在每次真正的鼠标点击时触发,而是大约只有一半的实际点击(它会有所不同)。我必须说$ scope.hero不是静态的,并且使用$ interval在后台更新(它会定期更改指向新英雄对象的英雄指针)。我认为问题可能与此更新或某些ng-repeat和ng-click干扰有关 - 我的应用程序中的其他ng-click指令可以在每次真正的鼠标点击时正常触发:

<button class="btn btn-primary inline" ng-click="pass()">Pass</button> <!-- all mouse clicks are processed -->

可以采取哪些措施来解决或避免这样的问题?

有关更多信息,我提供播放(传递相同)和更新功能

    $scope.play = function(id) {
    if(!$scope.processingAction) {
        $scope.processingAction = true;
        $scope.action.type = "card";
        $scope.action.source = [id];
        $scope.action.aim = [];
        gameService.playerAction($scope.action, function() {
            $scope.action.type = "";
            $scope.action.source = [];
            $scope.action.aim = [];
            $scope.processingAction = false;
        },
        function(err) {
            $scope.action.source = [];
            $scope.processingAction = false;
            alert(err);
        });
    }
};

(所有工作都没有$ scope.processingAction,所以这不是标志问题)

var update = function() {
    $scope.state = gameService.getGame().state;
    if($scope.state) {
        for(var i = 0; i < $scope.state.players.length; i++) {
            if($scope.state.players[i].nick === $scope.user.nickname) {
                $scope.hero = $scope.state.players[i];
                break;
            }
        }
    }
}
var updatePromise = $interval(update, 1000);

gameService.getGame()是非阻塞的。

1 个答案:

答案 0 :(得分:0)

ng-click需要一个角度表达式。在内部,angular使用$ parse服务来评估ng-click =“expression”中的表达式。

角度表达式与常规javascript代码不同。 $ parse使用字符串解析来解释表达式,它将对变量,函数和对象的访问限制为$ scope对象的属性,或者任何$ parent范围对象的属性,这些对象恰好可以在原型中进一步使用继承链。

所以理论上你可以获得像这样的全局变量:

$scope.window = window;
 $scope.pass= pass;

然后

ng-click="pass()"