最近在寫乙個日期選擇器元件,為了滿足將來可能出現的各種需求,所以需要能夠高度的自定義元件的樣式。為了達到這個目的,需要能夠在日期選擇器元件外控制每個日期格仔內要顯示的內容,比如,標上節假日之類的。這時候,元件的一部分模板就需要由呼叫方提供。
在 react 裡面,這種需求挺簡單的,只要實現乙個date => element
這樣的函式就好了,但是 angular 模板是純粹的模板,需要使用一些專門的概念才能實現這個功能。
這個標籤到本文撰寫時為止,還沒有官方的文件,甚至連佔位符都沒有。但是這並不妨礙我們的使用,外國熱心網友已經總結出了
在現階段的特點與作用。
hello
假設我們有乙個上述的元件,然後向下面這樣呼叫:
那麼最終的渲染結果將會是這樣的:
hello
world
嗎?答案是不會的。
的本質只是移動元素,並不會去自動的建立傳入的模板,所以就算用ngfor
套住
也不會出現很多個world
。如果傳入的是自定義的元件,這些元件也只會被例項化一次。
當然,如果的功能僅僅只是這樣就顯得太雞肋了,在使用
的時候可以指定乙個選擇器,這個選擇器可以捕獲相符的直接子元素。例如:
hello
然後像下面這樣使用:
2333
最終的渲染結果將會是這樣:
hello
2333
world
除了設定ng-content
標籤的select
屬性之外,還可以在子元素上使用ngprojectas
屬性,這個屬性可以讓這個元素被父元素中指定的ng-content
所捕獲。舉個例子:
2333
這次被傳入的模板變成了乙個div
,但是因為設定了ngprojectas
,所以「world」會出現在分割線下方。
使用ng-content
確實可以起到傳入模板的效果,但是卻有個很致命的問題,就是無法傳遞資料到傳入的模板中。為了將資料傳遞到傳入的模板中,就需要使用到ngtemplateoutlet
指令。
這個指令可以用來在模板的指定位置例項化乙個templateref
物件,同時,在例項化的過程中還可以傳入乙個資料物件。而templateref
可以通過ng-template
標籤來建立,舉個例子:
@component(}!`})
class ngtemplateoutletexample ;
}
ng-container
是乙個虛擬的元素,在這個元素上我們使用了乙個ngtemplateoutlet
指令,指定了要例項化下面的名為name
的ng-template
。同時把mycontext
這個物件作為例項化的資料上下文傳入,所以最終就會顯示 「hello world!」。值得注意的是在ng-template
裡面獲取傳輸的資料上下文的方式:let-variablename='key'
。
接下來就要實現本文開頭提到的需求了,在元件外部傳入模板。還是以上面的例子為例,因為模板需要由外界作為子內容傳入,所以需要我們手動來捕獲模板,這裡需要就需要使用contentchild
:
@component()
class ngtemplateoutletexample ;
}
就是這麼簡單的改動就可以讓我們的元件從外界接受模板了,來試一試:
以上就是 angular 中向元件傳遞模板的兩種方法,其中,使用標籤可以更方便的控制傳入的模板在 dom 中的位置,而
ngtemplateoutlet
可以向傳入的模板傳遞渲染資料,兩者搭配使用可以起到很好的效果。
參考:ng-content: the hidden docs
父元件向子元件傳遞資料 14 父元件向子元件通訊
1.不使用 v bind 傳遞資料 2.使用 v bind 傳遞資料 3.以上兩者的區別。先把重要的知識點寫在前面 簡單來說,父元件向子元件傳遞資料可以分為以下幾個步驟 在父元件繫結資料 在子元件使用 props 接收資料 在子元件使用資料。data components 渲染 2.在子元件上繫結 ...
vue prop 向子元件傳遞資料
prop是你可以在元件上註冊的一些自定義attribute。當乙個值傳遞給乙個prop attribute的時候,它就變成了那個元件例項的乙個property。乙個 prop 被註冊之後,你就可以像這樣把資料作為乙個自定義 attribute 傳遞進來 乙個元件預設可以擁有任意數量的prop,任何值...
vue子元件向父元件傳遞資料
vue專案中經常使用到元件之間的數值傳遞,實現的方法很多,但是原理基本上大同小異。子元件向父元件出傳遞資料,使用自定義事件的方式。父元件向子元件傳遞資料,使用props屬性的方式。推薦文章 vue筆記 父元件向子元件傳遞資料 我們可以從子元件中想父元件中傳遞多個資料,在子元件中要做的工作只是,使用t...