правильный способ назначения и использования контроллера в директивах в AngularJS

как правильно назначить контроллер директиве, чтобы 2 директивы могли общаться друг с другом. Когда я устанавливаю требуемый аргумент второй директивы на имя первой директивы, я получаю ошибку в консоли:

Error: No controller: dir at Error () at getControllers (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js:4132:19) at nodeLinkFn (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js:4259:35) at compositeLinkFn (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js:3869:15) at compositeLinkFn (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js:3872:13) at nodeLinkFn (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js:4252:24) at compositeLinkFn (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js:3869:15) at compositeLinkFn (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js:3872:13) at publicLinkFn (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js:3775:30) at http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js:934:25 <div class="btn btn-danger" dir2=""> angular.js:5601

(anonymous function)angular.js:5601

(anonymous function)angular.js:4698

nodeLinkFnangular.js:4261

compositeLinkFnangular.js:3869

compositeLinkFnangular.js:3872

nodeLinkFnangular.js:4252

compositeLinkFnangular.js:3869

compositeLinkFnangular.js:3872

publicLinkFnangular.js:3775

(anonymous function)angular.js:934

Scope.$evalangular.js:7905

Scope.$applyangular.js:7985

(anonymous function)angular.js:932

invokeangular.js:2813

bootstrapangular.js:930

angularInitangular.js:906

(anonymous function)angular.js:14600

cjquery-latest.min.js:3

p.fireWithjquery-latest.min.js:3

b.extend.readyjquery-latest.min.js:3

H

Here's an example in plnkr.

Edit :

I'm trying to do something that is present in a lot of websites, change the view template by clicking on a button or link from list view to thumbnails view etc... I thought about making 2 directives one called "switcher" for the button switcher and the other called "switchable-view" for the view. here's a plnkr with an example code. The idea is when i click on the "switcher" directive it switch the template in the switchable directive which will result on switching the view, I hope this is clear enough. what i'm trying to do is something like this plnkr

Thanks in advance.

1
nl ja de

1 ответы

Фактически, когда вы хотите делиться контроллером между директивами, вам нужно иметь то или на одном элементе или где-то сверху по иерархии (и добавить «^» перед именем на require).

Таким образом, ответ на ваш вопрос будет следующим: эта ошибка возникает, потому что требуемая директива/контроллер не находится на том же или верхнем уровне иерархии элементов DOM.

Я полагаю, вы хотели бы иметь некоторый контейнер для хранения списка атрибутов , а затем манипулировать этим списком из директив. Мое предложение было бы иметь другую директиву для их хранения (например, ngForm). Поэтому и directiveis (dir, dir2), которые находятся на разных листах иерархии DOM, требуют некоторой директивы, которая бы содержала общие данные и имела бы общую иерархию. Вид:

──── attributesDirective (in controller: this.doSomething())
                     ├ dir1 (requre: '^AttributesDirective')
                     └ dir2 (requre: '^AttributesDirective')   

BUT, actually, you can achieve what you've described at 'EDIT' without adding any directive and any JS code: add property template that will store name of template file and change this property when user clicks on items. ngInclude will pick up new value and reload template.

Вот ваш измененный плункер с этим решением: http://plnkr.co/edit/z7wg1TCIdmQjfT8A2rZe?p= предварительный просмотр

2
добавлено
Привет, спасибо за повторную игру, я как бы новый для углового, и мое понимание DOM нехорошо, так что голый со мной, пожалуйста, на самом деле, что я хочу, это иметь представление списка и представление большого пальца, меняя шаблон , Подробности см. в разделе «Редактирование».
добавлено автор Yahya KACEM, источник
еще одна вещь, мне непонятно, что вы подразумеваете под кодом . Поэтому и directiveis (dir, dir2), которые находятся на разных листах иерархии DOM, требуют некоторой директивы, которая будет содержать общие данные и будет иметь общую иерархию , как создать директиву, имеющую общую иерархию?
добавлено автор Yahya KACEM, источник
Спасибо, это было удивительно просто.
добавлено автор Yahya KACEM, источник
обновленный ответ, учитывая то, что вы написали после EDIT.
добавлено автор Valentyn Shybanov, источник
Angular — русскоговорящее сообщество
Angular — русскоговорящее сообщество
3 960 участник(ов)

Общаемся на темы Angular 4+, его экосистемы, TypeScript, NativeScript и т.д. По вопросам SSR, Angular Universal @angular_universal_ru См. также: @typescript_ru, @react_js, @nodejs_ru, @js_ru Вакансии и поиск работы: @javascript_jobs

Angular.js (1.x) — русскоговорящее сообщество
Angular.js (1.x) — русскоговорящее сообщество
704 участник(ов)

Общаемся и обсуждаем темы, посвященные Angular 1.x и экосистеме.

AngularJS, Javascript
AngularJS, Javascript
370 участник(ов)

Angularjs russian chat