首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ng单击在案例1中不起作用,而在案例3中起作用?

为什么ng单击在案例1中不起作用,而在案例3中起作用?
EN

Stack Overflow用户
提问于 2014-05-18 18:16:34
回答 5查看 48.6K关注 0票数 38

显然有一些基本的东西我还没有理解。

我试图让用户使用角形Ui.Bootstrap中的Modal模块,但我发现我的点击并没有激活open()函数,因此将其简化为一个非常简单的测试用例,如下所示,当ng单击指向一个函数(警报或console.log)时,我没有看到任何调用,但是当ng单击指向只是一个表达式的东西时,它就起作用了。

为什么在第一个示例中没有调用alert

代码语言:javascript
复制
<div data-ng-app>
    <button data-ng-click="alert('Message 1');">
        ngClick -- not working, why not?
    </button>
    <button onclick="alert('Message 2');">
        Plain onclick
    </button>
    <button data-ng-click="count = (count + 1)">
          But this works, why ???
    </button>
    count: {{count}}
</div>

http://jsfiddle.net/H2wft/1/

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-05-18 18:21:46

ng-click用于当前作用域中的函数(例如,$scope.alert = window.alert将解决不能在该范围内发出警报的问题)或角表达式。它看起来不允许您在其中使用全局范围方法(它可能是在当前的$scope中查找它们,它们是从其中丢失的)。

票数 47
EN

Stack Overflow用户

发布于 2014-05-19 05:02:19

ng-click期望有一个角表达式。在内部,angular正在使用$parse服务来评估ng-click="expression"中的expression

角表达式与常规javascript代码不一样。$parse使用字符串解析来解释表达式,并将您对变量、函数和对象的访问限制为仅限于$scope对象的属性或任何恰好在典型遗传链上可用的$parent作用域对象的属性。

所以从理论上说,你可以获得这样的全球信息:

代码语言:javascript
复制
 $scope.window = window;
 $scope.alert = alert;

..。然后在模板中执行ng-click="window.alert('hello!')"

...or...ng-click="alert('hello!')"

或者你只需要做一次

代码语言:javascript
复制
 $rootScope.window = window;
 $rootScope.alert = alert;

然后,原型从$rootScope继承的任何作用域也将访问窗口和警报。

..。但是,有充分的理由永远不做上述任何一项,除非可能是为了调试目的。这并不是说装饰$rootScope总是一个坏主意,至少有一种特殊情况,在这种情况下,装饰角度的范围可以完成一些很难做到的事情,否则

票数 22
EN

Stack Overflow用户

发布于 2014-05-18 18:24:47

不能在ng指令中执行这种代码。他们在您的本地范围内查找内容。

如果在控制器中这样做:

代码语言:javascript
复制
$scope.alert = function(){
  alert('alerted!');
};

然后在模板中

代码语言:javascript
复制
ng-click="alert()"

它将正确执行javascript警报。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23725312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档