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

@ Степан Касьяненко. В 'card-item' есть кнопка предварительного просмотра. Когда «карточный элемент» находится в предварительном просмотре, кнопка «Предварительный просмотр» должна быть подсвечена (в то время как другие кнопки «Предварительный просмотр» в «Картах» отсутствуют). Вот почему «карточный элемент» должен знать внешний контекст («является ли я тем предварительным, среди других« карточных элементов »). Благодарим за комментирование. – 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: '=' 
     } 
    } 
}); 

Вы также можете попытаться разделить эту директиву на меньшие директивы подразделов.