AngularJS - 在$ event.stopPropagation之后停止ng-click表达式评估

时间:2015-03-04 21:06:14

标签: javascript angularjs events angularjs-ng-click

在调用事件取消后,我正在努力停止评估表达式的其余部分的ng-click。

我做了以下plnkr

如果单击“Click me”文本,您将看到值正在变化,尽管clickMe函数正在调用所有已知方法(至少由我来)以停止事件。

标记:

 <body ng-controller="Home" ng-init="model = { value: false }">
    <div ng-click="clickMe($event); model.value = true;">Click me!!</div>
    {{ model.value }}
  </body>

应用:

APP.controller('Home', function($scope){
  $scope.clickMe = function($event){
    $event.stopPropagation();
    $event.preventDefault();
    return false;
  }
})

我知道我可以将参数传递给clickMe函数,如果“isOK”为false,则更新我需要的内容,但由于很多原因绑定到我的应用程序,我尽量不这样做。

更新

在我的应用程序中,我在ng-click

上有类似的内容
model.PS.title = value; model.PS.desc = value2; model.PS.isSce = value3

我是瞎子,我看不出我能这么简单:

model.PS = { title: value, desc: value2, isSce: value3 }

...在这种情况下,我可以使用像@Emmanuel所提到的if语句的简写表达式。

我在想,ngClick会像函数块一样评估其中的表达式,所以如果遇到return false(或类似的东西),它就会停在那里。

2 个答案:

答案 0 :(得分:1)

使用$scope.$eval运行点击处理程序后,您可以评估表达式。

您可以将点击有效后要运行的表达式传递给点击处理程序,并根据isOK变量评估表达式。

我已经扩展了一些演示,以显示$eval的功能。

请找到更新的plunkr here

<强> HTML

 <body ng-controller="Home" ng-init="model = { value: false }; model2 = {value:true}">
     <div ng-click="clickMe($event, 'model.value = true; model2.value = false;');">Click me!!</div>
     {{ model.value }}

     {{ model2.value }}
     <br/>
     check to enable click me!
     <input type="checkbox" ng-model='isOK'/>
 </body>

<强> JS

var APP = angular.module('myApp', []);

APP.controller('Home', function($scope){
       //var isOk = true;
        $scope.isOK = false;

        $scope.clickMe = function($event, args){

        if($scope.isOK){
            console.log(args);
            $scope.$eval(args);
            return false;
        } else {
            console.log('isOk false:', args);
        }
    }
});

答案 1 :(得分:0)

怎么样

<body ng-controller="Home" ng-init="model = { value: false }">
    <div ng-click="model.value = clickMe($event) ? true : model.value;">Click me!!</div>
    {{ model.value }}
</body>

按原样保留应用

APP.controller('Home', function($scope){
  $scope.clickMe = function($event){
    $event.stopPropagation();
    $event.preventDefault();
    return false;
  }
})