为什么ngClick在$ compile之后不再起作用?

时间:2013-11-02 12:39:43

标签: javascript jquery angularjs

  

http://plnkr.co/edit/kL2uLPQu2vHHKIvRuLPp?p=preview

点击按钮后,我从控制器调用编译html的服务并将其注入正文。

html是针对控制器的$ scope编译的(参见$ scope.name中的“Hello World”),但是ngClick不起作用。

为什么?

我如何针对单个手机的范围进行编译(在ng-repeat中?)?

我知道在这种情况下最好有一个指令,但我需要了解它是如何工作的,因为我需要它来进行对话(参见How can I get AngularJS binds working with a fancybox dialog?

2 个答案:

答案 0 :(得分:3)

我在这里看到的两个问题似乎都源于对角度的表达和范围的误解。

在指令或绑定中使用表达式时,例如在这两个示例中

<p>{{ phone.name }}</p>
<a ng-click="alert('angular')">Link</a>

他们无法访问JavaScript范围。这些中使用的任何标识符都来自角度范围,即$scope。所以

{{ phone.name }}

将显示

$scope.phone.name

ng-click="alert('angular')"

将尝试致电

$scope.alert('angular')

查看您的plunker,您尝试同时使用phonealert,而不是将它们分配给范围。您可以通过将其分配给控制器范围来创建一个执行警报的功能,但phone将更加困难,因为它每次都需要不同。

您可以为此创建一个全新的范围,并按照here分配phone,或者您可以从ng-repeat内部传递范围并编译新元素这个范围正如我所做的here

答案 1 :(得分:2)

在编译模板的alert上未定义名称$scope。如果您确实包含alert功能,则ng-click可以正常运行:

$scope.alert = function (msg) { window.alert(msg); };

Demo

但是,正如您自己指出的那样,这项工作更适合directive而不是服务。