Angular7自定義屬性指令控制第三方元件

2021-09-12 12:45:37 字數 1396 閱讀 6704

最近前端框架轉移到螞蟻的ng-alain和ng-zorro上,需要把我們自己的一些前端資料邏輯對接到ng-zorro提供的元件上,以簡化前端**。以前的做法是定義一組自己的自定義元件來包裝ng-zorro提供的元件,但這個方法的缺點是頁面上很難直接使用ng-zorro元件的屬性、事件和其他特性,除非自定義元件把ng-zorro元件的屬性和事件都暴露出來,ng-zorro元件的屬性事件非常多,全部暴露出來太麻煩,不太現實。

突然想到是否能夠利用angular自定義指令控制ng-zorro元件,這樣頁面上放置的不是自定義元件,而是ng-zorro元件,然後附加上乙個自己寫的自定義指令,新增自己的一些屬性和事件,頁面上仍然可以使用所有的ng-zorro元件的屬性和事件。

網上找到的angular自定義屬性指令的例子大多都是注入elementref和renderer2,控制html標籤的屬性。沒找到自定義指令控制第三方元件的例子。最先想到的是通過@input方式傳入ng-zorro元件的例項。如下,自定義屬性指令treeselectdirective控制ng-zorro的下拉樹元件nztreeselectcomponent

自定義指令的ts檔案:

@directive()

export class treeselectdirective implements onchanges,ondestroy,oninit,afterviewinit

頁面的html模板:

這個方法可以在指令類treeselectdirective獲得元件nz-tree-select的例項,並且控制nz-tree-select元件,但因為元件例項是在@input中傳入,而@input是在生命週期的ngoninit鉤子被呼叫時才傳入,而元件的ngoninit鉤子比指令的ngoninit鉤子先被呼叫,這意味著指令獲得元件的例項之前,元件例項的各個輸入屬性已經完成初始化。這會帶來一些問題,ng-zorro元件的有些屬性初始化之後再設定就無法生效(可能是zorro的bug),必須在ng-zorro元件ngoninit鉤子呼叫前設定這些屬性值才能生效,所以通過@input傳入元件例項,無法設定這些屬性的值並使其生效。

另外,然後猜想,既然指令可以注入controlvalueaccessor,是不是也可以直接注入nztreeselectcomponent,於是試驗:

@directive()

export class treeselectdirective implements onchanges,ondestroy,oninit,afterviewinit

}

頁面的html模板:

測試發現nz-tree-select成功注入指令例項,constructor被呼叫的時候,nz-tree-select元件的@input輸入屬性還沒有初始化,可以在constructor中設定nz-tree-select元件的屬性。而且**也更優雅簡潔。

angular 自定義指令

模板 var mymodule angular.module mymodule mymodule.directive directivename function return restrict string,template string,templateurl string,priority n...

angular自定義指令詳解

在運用angularjs的時候,運用自定義指令可以寫一些元件,非常方便。這裡給大家分享一些關於angular自定義指令的知識。對於指令,可以把它簡單的理解成在特定dom元素上執行的函式,指令可以擴充套件這個元素 的功能。directive mydirective function timeout,u...

angular自定義指令Directive使用方法

1.建立directive ts檔案 highlight.directive.component.ts directive,elementref 引用2個屬性 import from angular core directive 注入elementref物件 constructor private ...