阻止控制器创建新的作用域对象

Prevent controller from creating new scope object

本文关键字:作用域 对象 创建 控制器      更新时间:2023-09-26

我将一个自定义范围对象传递给$compile并创建一个自定义模板。如果我对模板内的元素应用指令,那么正在更改的范围就是传递给$compile的范围,这正是我真正想要的。然而,我只是觉得在模板中的一些元素上也有一个控制器,可能是件好事

<div ng-controller="controllerName" >
</div>

但是ng控制器不在传递的作用域上设置数据,而是创建自己的作用域并使用它。有没有办法让ngController使用现有的作用域而不创建新的作用域?

我们创建控制器,并将其封装在工厂中以使其可访问。我们通过指令应用或控制(也会消失)。这为您提供了一个作用域为指令的控制器,它对作用域有更好的控制,这对我们来说很有效,因为我们这样做的指令通常是组件。

考虑到你现在的处境,我不知道这是否是一个选择。我建议尝试停止使用ng控制器。你现在可能想看看angular 2,只是为了记住它是一条迁移路径,它将在不久的将来出现。他们已经移除了ng控制器,他们在角2中所做的很多事情现在都可以完成了。

这是一个很好的资源,说明为什么这些东西是一个坏主意

https://www.youtube.com/watch?v=gNmWybAyBHI&t=9m10s

如果你查看ng-controller的源代码,你会发现它非常简单:

var ngControllerDirective = [function() {
  return {
    restrict: 'A',
    scope: true,
    controller: '@',
    priority: 500
  };
}];

实际上,您可以创建一个几乎相同的备用指令,只定义scope: false(或者完全省略scope密钥,相同):

app.directive('controllerNoScope', function () {
  return {
    restrict: 'A',
    scope: false,
    controller: '@',
    priority: 500 // same as ng-controller
  }
});

您可能需要给它一个更好的名称)。

请参阅此Plunkr的演示,该演示显示作用域与外部作用域具有相同的$id,这意味着它是相同的作用域。