Ошибка AngularJS - [$compile:multidir] Ошибка нескольких директив

Я использую следующие пакеты: Модальный модуль angularjs из пакета angular-ui: http://angular-ui.github.io/bootstrap/#/modal и Angular-flexslider отсюда: https://github.com/EnthusiasticCode/angular-flexslider< /а>

Каждый плагин работает хорошо, когда он находится на отдельных страницах. но когда я использую их на одной странице, angular-flexslider вызывает ошибку:

Error: [$compile:multidir] Multiple directives [flexSlider, slide] asking for transclusion on: <div class="flexslider-container ng-isolate-scope ng-scope" slide="s in slides" animation="slide">
http://errors.angularjs.org/1.2.0-rc.2/$compile/multidir?p0=flexSlider&p1=s…20ng-scope%22%20slide%3D%22s%20in%20slides%22%20animation%3D%22slide%22%3E
    at ...

Файл шаблона такой:

<flex-slider slide="s in slides" animation="slide">
    <li>
        <img ng-src="{{s}}">
    </li>
</flex-slider>

<div ng-controller="ModalDemoCtrl">
    <script type="text/ng-template" id="myModalContent.html">
        <h3>I'm a modal!</h3>
    </script>

    <button class="btn" ng-click="open()">Open me!</button>
</div>

И файл app.js:

angular.module('theApp', ['theApp.filters', 'theApp.services', 'theApp.directives', 'theApp.controllers', 'ngRoute', 'ngSanitize', 'angular-flexslider', 'ui.bootstrap']).
  config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/home', {templateUrl: (someurl...) , controller: (a name ...) });
  }]);

Файл controller.js:

angular.module('theApp.controllers', [])
 .controller('SliderMedium', [ '$scope', function($scope) {
   $scope.slides = [
     'images/slider/01.png',
     'images/slider/02.png',
   ];
 }]);

// ========= THIS IS controllers from angular-ui with no modification =======:
// ==========================================================================
var ModalDemoCtrl = function ($scope, $modal) {

  $scope.items = ['item1', 'item2', 'item3'];

  $scope.open = function () {

    var modalInstance = $modal.open({
      templateUrl: 'myModalContent.html',
      controller: ModalInstanceCtrl,
      resolve: {
        items: function () {
          return $scope.items;
        }
      }
    });
  };
};

var ModalInstanceCtrl = function ($scope, $modalInstance, items) {

  $scope.items = items;
  $scope.selected = {
    item: $scope.items[0]
  };

  $scope.ok = function () {
    $modalInstance.close($scope.selected.item);
  };

  $scope.cancel = function () {
    $modalInstance.dismiss('cancel');
  };
};

Как я могу это исправить? Сообщите мне, нужна ли дополнительная информация. Спасибо.

ОБНОВЛЕНИЕ: удалены ненужные HTML-разметки, добавлено содержимое controller.js и app.js.


person Morteza Ziyae    schedule 02.10.2013    source источник
comment
Извините, но я не вижу, где вы используете директивы flexSlider и slide? Это все ваши шаблоны или они неполные?   -  person Thomas Pons    schedule 02.10.2013
comment
@ThomasPons извините за это. вопрос обновлен.   -  person Morteza Ziyae    schedule 02.10.2013


Ответы (4)


Директива с именем slide выглядит как в angular-flexslider, так и в ui.bootstrap.carousel. Если вам не нужна карусель, попробуйте собрать AngularUI Bootstrap без поддержки карусели.

Похоже, что angular использует boostrap slide вместо flexslider slide, а bootstrap требует включения, которое также требуется для flex-slider, поэтому возникает конфликт относительно того, какой из них имеет приоритет.

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

person Jussi Kosunen    schedule 02.10.2013
comment
В документации теперь указано использовать flex-slide в качестве директивы в сочетании с пользовательским интерфейсом начальной загрузки (github.com/thenikso/angular-flexslider#usage). См. stackoverflow.com/questions/23475821/ - person Jeff Ancel; 14.12.2014

Чтобы избежать конфликта с каруселью начальной загрузки, thenikso/angular-flexslider добавил новую директиву flex-slide вместе с slide.

Пользователи Bootstrap могут использовать директиву flex-slide вместо директивы slide.

<flex-slider flex-slide="s in slides" animation="slide">
    <li>
        <img ng-src="{{s}}">
    </li>
</flex-slider>
person LX7    schedule 28.01.2015

Юсси Косунен имеет право, но вам не нужно делать свою собственную сборку AngularUI Bootstrap. Просто переименуйте слайд в fslide в HTML.

<flex-slider slide="s in slides" animation="slide">
    <li>
        <img ng-src="{{s}}">
    </li>
</flex-slider>

to

<flex-slider fslide="s in slides" animation="slide">
        <li>
            <img ng-src="{{s}}">
        </li>
</flex-slider>

И, конечно же, директива в angular-flexslider.js.

match = attr.slide.match(/^\s*(.+)\s+in\s+(.*?)(?:\s+track\s+by\s+(.+?))?\s*$/);

to

match = attr.fslide.match(/^\s*(.+)\s+in\s+(.*?)(?:\s+track\s+by\s+(.+?))?\s*$/);

И не забудьте оставить эти шаги в файле Readme для других участников.

person Anand Bayarbileg    schedule 22.06.2014

Я получил эту ошибку... потому что я скопировал готовую директиву, чтобы создать новую директиву... и забыл изменить имя директивы. .directive('addTransaction', function () {

person Chareesa Graham    schedule 19.10.2018
comment
Можете ли вы добавить контекст относительно того, как это помогает OP? - person Nathan Thomas; 20.10.2018