Подтвердить что ты не робот

"контроллер как" vs изолировать область действия

Я хотел бы использовать опцию 'controllerAs' в моих директивах. Позвольте мне привести аргументы из "" Руководство по стилю AngularJS для пользователей Closure в Google":

Почему? Ввод методов и свойств непосредственно на контроллер, вместо создания объекта области, лучше подходит для Google Закрытие стиля класса. Кроме того, использование "controller as" делает его очевидный, к какому контроллеру вы обращаетесь, когда несколько контроллеров применим к элементу. Поскольку всегда есть ".". в привязках, вы не нужно беспокоиться о прототипальных примитивах маскирования наследования.

Но я вижу проблему с использованием этого подхода, если директива изолирует привязки к области.

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

В этом случае свойство bar привязано к области действия, а не к контроллеру, что приводит к запутанной непоследовательной ситуации, когда различные свойства следует искать в разных местах. Каков "официальный" рекомендуемый способ обойти это?

ОБНОВЛЕНИЕ: см. вопрос GitHub об этом.

4b9b3361

Ответ 1

Это было разрешено в Angular 1.3, добавив свойство bindToController в директиву .

Ответ 2

Трудно найти "официальный" шаблон для этого. Лично я думаю, что это зависит от вашей цели.

Если вы хотите обнародовать информацию из Директивы во внешний мир, используйте Изолированную область как одну из причин, по которой она существует. Этот "API" также не должен быть полностью определен в Директиве, он может быть определен в службе AngularJS, которую вы вводите в Директиву и выставляете через изолированную область таким образом, что у вас есть Директива, касающаяся главным образом пользовательского интерфейса наряду с сервисом, который обрабатывает любую бизнес-логику.

Если вы сообщаете между директивами, что предпочтительнее контроллер.

Однако, чтобы попытаться получить дополнительную официальную информацию, вот информация с сайта AngularJS по использованию контроллеров с директивами:

Best Practice: используйте контроллер, если вы хотите открыть API для других директив. В противном случае используйте ссылку.

Я лично никогда не видел, чтобы контроллеры использовались в директивах, за исключением директивы Directive-to-Directive. Я не говорю, что вы не можете их использовать, я просто этого не видел. Кроме того, если вы хотите разоблачить логику контроллера во внешнем мире, тогда вам придется привязываться к изолированной области, так что все зависит от того, что вы хотите сделать.