【发布时间】:2013-11-25 11:21:16
【问题描述】:
随着下一个稳定的 AngularJS 的发布,我正在将我的应用程序从版本 1.0.8 迁移到 1.2。
在 AngularJS 1.0.8 中,可以为 follow 等指令设置隔离范围。然后该指令将使用它自己的test() 函数而不是控制器的test() 函数。
HTML
<my-dialog property="something">
<button ng-click="test()">Load Test</button>
Check out the test: "{{ testMessage }}"
</my-dialog>
Javascript
.controller('Ctrl', function(scope) {
scope.test = function () {
scope.testMessage = 'CTRL Test loaded! Whooops.';
}
})
.directive('myDialog', function() {
return {
restrict: 'E',
scope: {
property: '='
},
link: function(scope) {
scope.test = function () {
scope.testMessage = 'Isolated Test loaded. Yes!';
}
}
};
在 AngularJS 1.2 中,这种行为不再起作用。点击按钮立即触发控制器的test() 函数。
查看这个 jsFiddle 比较:
究竟发生了什么变化?如何重现旧行为?
注意
我发现我可以将指令模板放在一个额外的 HTML 文件中或将其编译为字符串以使其正常工作 (jsFiddle) 但在我的情况下似乎太多了,因为模板是固定的并且正在拆分多个部分 HTML 文件的 HTML 很麻烦。
编辑
@elclanr's answer 在没有其他要共享的属性时可以正常工作。我更新了the jsFiddle 以传递一些任意属性。我现在应该如何进行?
【问题讨论】:
-
只是
scope: truejsfiddle.net/rug3J/1。我还建议遵循约定并将其命名为scope而不是$scope当它不是依赖注入时。 -
@elclanrs 哦,谢谢!那很简单。您能否将其发布为答案,我可以将此问题标记为已回答。
-
有趣-我刚刚检查过,这在 rc3 和现在之间发生了变化。除了将范围设置为 true,您还可以使用:
scope: {test: '&'}。我确认它可以按预期工作-将测试通过隔离范围。 -
@KayakDave 感谢您提供的文档,这似乎很有意义。
{test: '&'}不适合我,因为我不想使用控制器的 test() 函数。 -
只是为了确保一切都清楚 {test: '&'} 将导致 ng-click="test()" 调用您的指令的
test()而不是控制器的。与将范围设置为 true 的行为相同 - 除了您将对其他所有内容使用隔离范围。
标签: javascript angularjs angularjs-directive