点击按钮后,我从控制器调用编译html的服务并将其注入正文。
html是针对控制器的$ scope编译的(参见$ scope.name中的“Hello World”),但是ngClick不起作用。
为什么?
我如何针对单个手机的范围进行编译(在ng-repeat中?)?
我知道在这种情况下最好有一个指令,但我需要了解它是如何工作的,因为我需要它来进行对话(参见How can I get AngularJS binds working with a fancybox dialog?)
答案 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,您尝试同时使用phone
和alert
,而不是将它们分配给范围。您可以通过将其分配给控制器范围来创建一个执行警报的功能,但phone
将更加困难,因为它每次都需要不同。
您可以为此创建一个全新的范围,并按照here分配phone
,或者您可以从ng-repeat
内部传递范围并编译新元素这个范围正如我所做的here。
答案 1 :(得分:2)
在编译模板的alert
上未定义名称$scope
。如果您确实包含alert
功能,则ng-click
可以正常运行:
$scope.alert = function (msg) { window.alert(msg); };
但是,正如您自己指出的那样,这项工作更适合directive
而不是服务。