2017-07-17 91 views
8

我有一個類(接口)在我的角4應用程序,它有很多領域。 請注意,此類/接口的實例是immutable(即成員永遠不會被更改)。對於有很多字段的類/接口,性能會有什麼影響?

E.g.

public interface IHaveALotOfFields { 
    field1: string; 
    //... 
    field500: string; 
} 

此接口是通過提供一個(單件/應用程序級別提供的)服務提供的,該服務將類作爲成員公開。例如。

@Injectable() 
public class MyService { 
    public translations: ITranslationsProvider; 
} 

該服務在ts -part組件的注入大量在其相應的模板中使用的部件(幾乎所有組件)和經常的和經常也。例如。

@Component({ 
       template: `Value: {{service.field500}}` 
      }) 
export class MyComponent { 
    public constructor(public service: MyService) { 
    } 

    private doSomething(): string { 
     return this.service.field1; 
    } 
} 

現在我的問題:

  • 將一個大的類(很多領域)做出,因爲變化的檢測角慢?
  • 有沒有辦法將班級標記爲「忽略變更檢測」? (類似的東西來ChangeDetectionStrategy.OnPush,但不是指定此爲每個組件,可以在類本身或服務的成員上進行聲明)

請注意,我不想改變變化檢測所有我的組件的戰略OnPush

+0

的接口只是一種類型檢查的方法。它不會被注入...只有被注入的對象被一個類的新實例化。界面是這個班將遵守的合同。在界面中爲合同分配屬性和方法簽名......服務具有@Injectable和Angular負責爲您自動實例化這些東西,並自動將事物連接在一起。 – JGFMK

+0

我知道。我有實現這個接口的具體類。 MyService基本上獲得了實現注入接口的類的實例。 –

+0

界面不是隻注入對象..這是我希望能幫助你的。即您無法在界面上進行新操作... – JGFMK

回答

4

由於 變化檢測,一個大類(有很多字段)會使角度變慢嗎?

號角變化檢測執行該讀類屬性兩個操作:當前組分中的子組件

  • 輸入綁定更新上

    • DOM更新/指令

    對於這些操作角編譯器創建兩個函數:

    • updateRenderer - 讀取在模板
    • updateDirectives使用的字段 - 讀取在輸入綁定表達式

    這些功能讀取來自服務只有特定的屬性中指定的字段。對於示例

    Value: {{service.field500}}

    updateRenderer功能看起來沿線:

    function(_ck,_v) { 
        var _co = _v.component; 
        var currVal_0 = _co.service.field500; 
        _ck(_v,1,0,currVal_0); 
    

    這些函數被稱爲每個消化循環。但正如你所看到的,只有相關的財產將從服務中讀取。因此,服務上有多少物業並不重要。

    有沒有辦法將班級標記爲「忽略變更檢測」?

    我假設你問我們在AngularJS中的一次性綁定。也許它會被添加到Angular中。如果出現問題,我會監控並更新答案。但正如您可能知道的那樣,您可以使用cd.detach/cd.attach禁用/啓用組件的變更檢測。您可以在服務中監聽某些信號,並在需要時手動運行CD。

    下面是文章列表,你可以看的懂變化檢測的機制更好:

  • +0

    感謝您的出色答案。我認爲將類標記爲「忽略變化檢測」的方式是,如果有方法可以告訴角,則此特定類的屬性/字段是「常量」(具有常數值)並且永遠不會更改。無論班級是從服務中注入還是作爲輸入或其他方式注入。 –

    +0

    @OschtärEi,啊,我明白了。不,不幸的是,還沒有辦法做到這一點。在AngularJS中,我們有一次性綁定。也許它會被添加到Angular中。如果出現問題,我會監控並更新答案。但正如您可能知道的那樣,您可以使用'cd.detach/cd.attach'來禁用/啓用組件的變更檢測。您可以在服務中監聽某些信號,並在需要時手動運行CD。 –

    +0

    再次感謝。但是,如果我使用'detach/attach',則組件的所有變化檢測將被分離(我不想要的),並且我需要在所有組件中執行此操作(因爲幾乎所有組件都使用此「大類」 (這是翻譯) –

    相關問題