2016-01-06 42 views
3

我想使用angular 1.5的component()方法。但是,在同一個DOM元素上應用不同的組件似乎是不可能的。這是因爲無論我如何在component()調用中設置isolate屬性,都會創建一個新範圍,導致出現錯誤消息:如何使用Angular 1.5 component()方法將範圍設置爲false

[$ compile:multidir] Multiple directives [.. ]尋求新/隔離範圍

這並不奇怪,因爲成分()定義範圍創造這樣的:

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

所以我的問題是:這是一個bug或者是一般不支持在一個DOM元素上有多個組件?我知道我可以使用directive(),但考慮到Angular 2的遷移,我寧願將所有內容都移到component()。

回答

2

範圍屬性可以是true,一個對象或一個falsy值:

  • falsy:否範圍將爲指令來創建。該指令將使用其父級的範圍。

  • true是prototypically繼承其父一個新的子範圍將用於 指令的元素創建。如果同一元素上的多個指令請求新範圍,則僅創建一個新範圍。新的作用域規則不適用於模板 的根,因爲模板的根始終獲取新的作用域。

  • {...}(對象散列):爲指令的元素創建了一個新的「隔離」作用域。 「分離」範圍與正常範圍不同,因爲它不從原始範圍繼承其原始範圍。這在創建可重用組件時非常有用,它不應該意外讀取或修改父範圍內的數據。

從文檔:

一般有可能超過一個指令應用於一個要素,但也有可能是取決於範圍由指令所需要的類型的限制。以下幾點將有助於解釋這些限制。爲了簡化,只兩個指令都考慮到,但它也適用於幾種不同的指令:

  • 沒有範圍 + 沒有範圍 =>兩個指令不要求自己的範圍將使用他們的父母的範圍
  • 子範圍 + 沒有範圍 =>這兩個指令將共享一個單個子範圍
  • 子範圍 + 子SCO PE =>兩個指令都將共享一個單獨的子範圍
  • 隔離範圍 + 沒有範圍 =>分離指令將使用它自己的創建隔離範圍。其他指令將使用 其父的範圍
  • 隔離範圍 + 子範圍 =>都不行!只有一個範圍可以與一個元素相關。因此這些指令不能將 應用於相同的元素。
  • 隔離範圍 + 隔離範圍 =>不行!只有一個範圍可以與一個元素相關。因此,這些指令 不能應用於相同的元素。

- 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組件的方法,請閱讀託德座右銘的文章: http://toddmotto.com/exploring-the-angular-1-5-component-method/

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

+0

謝謝你的回答。我的問題是,在一個元素上有兩個指令,其中一個創建一個隔離範圍,另一個創建一個子範圍。所以我必須在他們兩個上設置「isolate:false」。我仍然不明白爲什麼component()方法不支持no scope選項。 –

+0

我很高興你找到我的答案有幫助。我已經添加了一些關於Angular JS Blog的組件的信息。他們似乎專注於使用控制器創建小部件。指令仍然使用'@ Directive'裝飾器在Angular 2中。 – georgeawg

0

與答案和評論上面的幫助下,我來到了以下結論:

組件()不支持創建沒有新範圍的組件。這隻能通過使用指令來完成(同樣在Angular 2中)。

+0

只是爲了確保我得到它的正確性,不可能在不隔離它的範圍的情況下製作組件? –

+0

取決於你如何定義術語「隔離」。從角度團隊的角度來看,您可以創建一個沒有獨立作用域的組件(即,作用域不是當前作用域的子作用域),但是您將始終創建一個新作用域(本例中爲子作用域)。 –

相關問題