【问题标题】:How to set scope to false with Angular 1.5 component() method如何使用 Angular 1.5 component() 方法将范围设置为 false
【发布时间】:2016-04-10 01:33:25
【问题描述】:

我想使用angular 1.5的component()方法。然而,在同一个 DOM 元素上应用不同的组件似乎是不可能的。这是因为无论我如何在 component() 调用中设置隔离属性,都会创建一个新范围,从而导致错误消息:

[$compile:multidir] 多个指令 [...] 要求新的/隔离的范围

这并不奇怪,因为 component() 定义范围创建是这样的:

scope: options.isolate === false ? true : {}

所以我的问题是:这是一个错误还是通常不支持在一个 DOM 元素上拥有多个组件?我知道我可以使用directive(),但考虑到Angular 2 迁移,我宁愿将所有内容移至component()。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    范围属性可以是true,一个对象或一个假值:

    • falsy:不会为指令创建范围。该指令将使用其父级的作用域。

    • true: 将为 指令的元素。如果同一元素上的多个指令请求新范围, 仅创建一个新范围。新的范围规则不适用于模板的根 因为模板的根总是有一个新的范围。

    • {...}(对象哈希):为指令的元素创建了一个新的“隔离”范围。这 'isolate' 作用域与普通作用域的不同之处在于它在原型上并不从其父级继承 范围。这在创建可重用组件时很有用,不应意外读取或修改 父范围内的数据。

    来自文档:

    一般来说,可以将多个指令应用于一个元素,但根据指令所需的范围类型,可能会有一些限制。以下几点将有助于解释这些限制。为简单起见,只考虑了两个指令,但它也适用于多个指令:

    • 无作用域 + 无作用域 => 两个不需要自己作用域的指令将使用其父作用域
    • 子范围 + 无范围 => 两个指令将共享一个子范围
    • 子范围 + 子范围 => 两个指令将共享一个子范围
    • 隔离范围 + 无范围 => 隔离指令将使用它自己创建的隔离范围。另一个指令将使用 其父级范围
    • 独立作用域 + 子作用域 => 不起作用!一个元素只能关联一个作用域。因此这些指令不能 应用于相同的元素。
    • 独立作用域 + 孤立作用域 => 不起作用!一个元素只能关联一个作用域。因此这些指令 不能应用于同一个元素。

    -- AngularJS $compile Service API Reference -- scope

    更新

    这是 AngularJS 博客对组件的评价:

    module.component

    我们创建了一种更简单的注册组件指令的方法。从本质上讲,组件是一种特殊的指令,它们绑定到一个自定义元素(类似于<my-widget></my-widget>),具有关联的模板和一些绑定。现在,通过使用 AngularJS 1.5 中的 .component() 方法,您可以用很少的代码行创建一个可重用的组件:

    var myApp = angular.module("MyApplication", [])
    myApp.component("my-widget", {
      templateUrl: "my-widget.html",
      controller: "MyWidgetController",
      bindings: {
        title: "="
      }
    });
    

    要了解有关 AngularJS 1.5 组件方法的更多信息,请阅读 Todd Motto 的文章: http://toddmotto.com/exploring-the-angular-1-5-component-method/

    -- http://angularjs.blogspot.com/2015/11/angularjs-15-beta2-and-14-releases.html

    【讨论】:

    • 感谢您的回答。我的问题是,一个元素上有两个指令,一个创建一个隔离范围,一个创建子范围。所以我必须在他们两个上设置“隔离:假”。我还是不明白为什么 component() 方法不支持 no scope 选项。
    • 很高兴您发现我的回答很有帮助。我从 Angular JS 博客中添加了一些关于组件的信息。似乎他们专注于使用控制器创建小部件。 Angular 2 中的指令仍然使用 @Directive 装饰器。
    【解决方案2】:

    在上面的答案和cmets的帮助下,我得出了以下结论:

    component() 不支持创建没有新范围的组件。这只能通过使用指令来完成(也在 Angular 2 中)。

    【讨论】:

    • 只是为了确保我做对了,如果不隔离它的范围就不可能制作一个组件?
    • 取决于您如何定义“隔离”一词。在 Angular 团队的意义上,您可以创建一个没有独立作用域的组件(即不是当前作用域的子作用域),但是您将始终创建一个新作用域(在这种情况下为子作用域)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2013-09-01
    • 2014-03-25
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多