1

各カード・アイテム・ディレクティブが多くの外部コンテキストを知り、それに応じて行動する必要があるとします。AngularJSディレクティブが隔離された範囲に多くのバインディングを持っている場合のベストプラクティスは何ですか?

のように私たちは、外の世界を監視するためのサービスを行い、カードアイテムディレクティブにサービスを挿入できますディレクティブあまりを知っているので、これは、悪い習慣のように思える

scope: { 
    item: '=', 
    service: '=', 
} 

<card-item item="card" 
      service="ItemService"> 
</card-item> 

サービス(例えば、ディレクティブの内部でサービスの関数を呼び出す)。

AngularJSのベストプラクティスに関する多くの記事には、アイソレーションが次のように記載されています。

しかし、それはまだ右ここに感じることはありません。

scope: { 
    item: '=', 
    isSelected: '&', 
    inSelectMode: '&', 
    inMoldMode: '&', 
    onToggleSelect: '&', 
    onTogglePreview: '&', 
    onToggleSort: '&', 
    onDelete: '&', 
    isPreviewing: '&', 
    isSorting: '&', 
    locales: '=', 
    printUrl: '=', 
} 

<card-item item="card" 
      is-selected="ItemService.isSelected(card)" 
      in-select-mode="ItemService.inSelectMode()" 
      in-mold-mode="ItemService.inMoldMode()" 
      on-toggle-select="ItemService.toggleSelect(card)" 
      on-toggle-preview="ItemService.togglePreview(card)" 
      on-toggle-sort="ItemService.toggleSortMode()" 
      on-delete="ItemService.removeParticle(card)" 
      is-previewing="card === entityInPreview" 
      is-sorting="ItemService.inSortMode()" 
      locales='LocaleService.currentLocales' 
      print-url="getPrintUrl(card)"> 
</card-item> 

あなたの提案は何ですか?

読んでいただきありがとうございます。

+0

ディレクティブコントローラからサービスを呼び出してみませんか? –

+0

おそらく、 'card-item'ディレクティブを小さなディレクティブに分割して、特定のタスクを実行する必要があるかもしれません。例えば、印刷やダウンロードのために 'card-item-print'という指令を作成する。例えば、プレビューのための 'card-item-preview'指示文を作成する。等々。 –

+0

@StepanKasyanenko。 'card-item'の中には' Preview 'ボタンがあります。 'card-item'がプレビューにあるとき、"プレビュー "ボタンはハイライトされる必要があります(他の' card-item's "Preview"ボタンはそうではありません)。そういうわけで、 'card-item'は外部の文脈を知っていなければなりません("私がプレビュー中であるか、他の 'card-items'の中にあるか)。コメントしてくれてありがとう。 – user2990181

答えて

0

あなたはディレクティブコントローラを形成する、

xApp.directive('xDirective', function(itemService, LocaleService, getPrintUrl) { 
    function controller() { 
     angular.extend($scope, { 
      isSelected: ItemService.isSelected(card), 
      inSelectMode: "similar to above", 
      inMoldMode: "similar to above", 
      onToggleSelect: "similar to above", 
      onTogglePreview: "similar to above", 
      onToggleSort: "similar to above", 
      onDelete: "similar to above", 
      isPreviewing: "similar to above", 
      isSorting: "similar to above", 
      locales: "similar to above", 
      printUrl: "similar to above" 
     })  
    } 

    return { 
     controller: controller, 
     scope: { 
      card: '=', 
      item: '=' 
     } 
    } 
}); 

あなたも小さなサブディレクティブにこのディレクティブを分割しようとすることができるサービスのメソッドを呼び出すようにしてください。

関連する問題