在我的棋盘游戏角度应用程序中,我使用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()是非阻塞的。
答案 0 :(得分:0)
ng-click需要一个角度表达式。在内部,angular使用$ parse服务来评估ng-click =“expression”中的表达式。
角度表达式与常规javascript代码不同。 $ parse使用字符串解析来解释表达式,它将对变量,函数和对象的访问限制为$ scope对象的属性,或者任何$ parent范围对象的属性,这些对象恰好可以在原型中进一步使用继承链。
所以理论上你可以获得像这样的全局变量:
$scope.window = window;
$scope.pass= pass;
然后
ng-click="pass()"