单击按钮后,我从控制器调用编译 html 并将其注入正文的服务。
html 是针对控制器的 $scope 编译的(参见 $scope.name 中的“Hello World”),但 ngClick 不起作用。
为什么?
我如何针对单个电话的范围进行编译(在 ng-repeat 内?)?
我知道在这种情况下最好有一个指令,但我需要了解它是如何工作的,因为我需要它用于一个对话框(请参阅如何让 AngularJS 绑定使用花式对话框对话框?)
单击按钮后,我从控制器调用编译 html 并将其注入正文的服务。
html 是针对控制器的 $scope 编译的(参见 $scope.name 中的“Hello World”),但 ngClick 不起作用。
为什么?
我如何针对单个电话的范围进行编译(在 ng-repeat 内?)?
我知道在这种情况下最好有一个指令,但我需要了解它是如何工作的,因为我需要它用于一个对话框(请参阅如何让 AngularJS 绑定使用花式对话框对话框?)
我在这里看到的两个问题似乎都源于对角度表达式和范围的误解。
当您在指令或绑定中使用表达式时,例如在这两个示例中
<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
会更加困难,因为它每次都需要不同。
您可以为此创建一个全新的范围并phone
像我在此处所做的那样进行分配,或者您可以从您的内部传递范围ng-repeat
并在此范围内编译您的新元素,就像我在这里所做的那样。
该名称alert
未$scope
在模板编译时定义。如果您确实包含一个alert
功能,那么ng-click
确实有效:
$scope.alert = function (msg) { window.alert(msg); };
但是,正如您自己指出的那样,这项工作更适合于directive
服务而不是服务。