17

我想在我的指令中使用'controllerAs'選項。讓我引用來自「An AngularJS Style Guide for Closure Users at Google」的推理:「controller as」vs isolate scope

爲什麼?將方法和屬性直接放到控制器上,而不是構建一個範圍對象,可以更好地適應Closure類的風格。此外,使用'控制器'使其 顯而易見當多個控制器 應用於元素時,您正在訪問哪個控制器。由於總是有'。'在綁定中,您不必擔心原型繼承掩蓋原語。

但是我可以看到使用這種方法的問題,如果該指令具有隔離範圍綁定。

angular.module('cmw').directive('fooWidget', function() { 
    return { 
     controller: function() { 
      this.qux = '123'; 
     }, 
     controllerAs: 'fooWidget', 
     scope: { 
      bar: '=' 
     }, 
     template: ' {{fooWidget.qux}} {{bar}} ' 
    }; 
}); 

在這種情況下,bar屬性附接到範圍,不向控制器,其導致混亂的不一致情況,其中不同的性能應在不同的地方尋找。什麼是'官方'推薦的方法來解決這個問題?

更新:關於此請參見GitHub issue

回答

2

很難找到這樣做的「官方」模式。我個人認爲這取決於你的目標是什麼。

如果您想將指令中的信息公開給外部世界,請使用隔離範圍,因爲這是它存在的原因之一。這個'API'並不需要在指令中完全定義,它可以在AngularJS服務中定義,您可以將其注入到指令中,並通過隔離範圍公開,這樣您就擁有了一個主要與UI相關的指令以及處理任何業務邏輯的服務。

如果您在指令之間進行通信,那麼首選控制器。

但是,試圖得到一些更多的官方信息,這裏是使用控制器與指令從AngularJS網站信息:

最佳實踐:當你希望暴露給其他指令的API使用的控制器。否則使用鏈接。

我個人從來沒有見過指令中使用控制器,除了指令指令通信。我不是說你不能使用它們,我只是沒有看到它。另外,如果你想將控制器邏輯暴露給外部世界,那麼你將不得不綁定到隔離的範圍,所以這一切都取決於你想要做什麼。

相關問題