Доступ к области действия контроллера из включенного контента

Я работаю над своим первым приложением Angular (ура!). Я пытаюсь создать общий модальный компонент, который может объявлять заголовок, настраиваемый контент и любые кнопки действий. Затем следует фоновая настройка, затем мои вопросы внизу.

Вот как я хотел бы использовать директиву.

<!-- in app/views/library/index.html -->
<!-- outside <modal> #i_work works great -->
<select id="i_work">
  <option value="{{libraryType.id}}" ng-repeat="libraryType in libraryTypes">{{libraryType.name}}</option>
</select>

<modal id="library_new" title="My Custom Title">
  <form>
    <!-- inside <modal> #i_dont_work doesn't work -->
    <select id="i_dont_work">
      <option value="{{libraryType.id}}" ng-repeat="libraryType in libraryTypes">{{libraryType.name}}</option>
    </select>
  </form>

  <modal-buttons>
    <!-- [toggle-modal] is another directive that shows/hides a given <modal> -->
    <button type="button" toggle-modal="library_new">cancel</button>

    <button type="submit" ng-click="addLibrary()">save</button>
  </modal-buttons>
</modal>

Вот код директивы:

// in app/scripts/directives/modal.js
'use strict';
angular.module('sampleAngularApp')
  .directive('modal', [function () {
    return {
      templateUrl: '/scripts/directives/modal.html',
      restrict: 'E',
      transclude: true,
      link: {
        pre: function preLink(scope, element, attrs) {
          scope.id = attrs.id;
          scope.title = attrs.title;
        },
        post: function preLink(scope, element, attrs) {
          // hacky-hack to transclude specific content into other targets.
          //   bound event handlers should be preserved (as implemented they are).
          //   this actually works
          var buttonWrap = element.find('modal-buttons');
          buttonWrap.children().each(function (index, button) {
            element.find('.modal-footer').append(button);
          });
          buttonWrap.remove();
        }
      }
    };
  }]);

... и шаблон директивы:

<!-- in app/scripts/directives/modal.html -->
<div class="modal" role="dialog">
  <div class="modal-header">
    <span class="title">{{title}}</span>
    <button type="button" class="close" toggle-modal="{{id}}">close</button>
  </div>

  <!-- the contents of .modal-body should be everything inside <modal> above, -->
  <!--   except for <modal-buttons> -->
  <div class="modal-body" ng-transclude />

  <!-- the contents of .modal-footer should be the contents of <modal-buttons> -->
  <div class="modal-footer" />
</div>

Вопросы:

1) Рассмотрим элементы <select> в представлении контроллера выше. #i_work отображается правильно с <option>s просто отлично. #i_dont_work отображает <select> без <option>. libraryTypes, кажется, не входит в область действия внутри <modal>. Почему это так, и как я могу это исправить?

2) Есть ли лучший способ включить определенный контент в несколько целей? Проект Google Polymer предоставляет <content /> необязательный атрибут [select] для предоставления нескольких целей вставки. В Angular есть что-то подобное? (Дополнительную информацию см. на веб-сайте Polymer.)


person ravinggenius    schedule 08.10.2013    source источник
comment
Попробуйте использовать функцию для получения библиотечных типов или оберните их в объект.   -  person jpmorin    schedule 08.10.2013
comment
Я сделал плункер: plnkr.co/edit/ZLGJhMIpt7DmRcBLPImd?p=preview, может вы мне скажите, что не работает, так как кажется, что оба выбора заполнены.   -  person jpmorin    schedule 08.10.2013
comment
Что касается вашего другого вопроса, в Angular нет такой вещи, но вы можете добиться этого, создав свои собственные директивы, как и вы!   -  person jpmorin    schedule 08.10.2013
comment
@jpmorin: я не знаю о ng-include, поэтому я развил ваш пример, чтобы показать больше, что я на самом деле пытаюсь (plnkr.co/edit/nNtvcTi0J3UblqXYcI87?p=preview). На plunker он работает внутри и снаружи модального окна, когда $scope.libraryTypes устанавливается синхронно, но не асинхронно.   -  person ravinggenius    schedule 09.10.2013
comment
@jpmorin Между тем, в моем приложении он работает синхронно и асинхронно вне модального окна и синхронно и асинхронно выходит из строя внутри модального окна.   -  person ravinggenius    schedule 09.10.2013
comment
Вы используете один и тот же контроллер для обоих?   -  person jpmorin    schedule 09.10.2013
comment
Я заметил, что вы закомментировали buttonWrap.remove();. Когда я снова прокомментировал это, оба выбора (синхронный и асинхронный) в модальном режиме перестали работать. Синхронный выбор вне модального продолжал работать. Удаление buttonWrap.remove(); в моем приложении позволяет правильно отображать оба выбора, когда $scope.libraryTypes устанавливается синхронно, но не асинхронно. Я не знаю почему.   -  person ravinggenius    schedule 09.10.2013
comment
Вы используете один и тот же контроллер для обоих? - Я не понимаю вашего вопроса. Оба что? Я предполагаю, что да, только потому, что у моего приложения пока только один контроллер. В моем приложении и в плункере я пытался установить $scope.libraryTypes синхронно и асинхронно в одном и том же контроллере.   -  person ravinggenius    schedule 09.10.2013
comment
давайте продолжим это обсуждение в чате   -  person ravinggenius    schedule 09.10.2013
comment
Вот ссылка, которую я нашел для включения в несколько элементов (blog.omkarpatil .com/2012/11/transclude-in-angularjs.html). Вам нужно будет использовать функцию компиляции директивы и явно определить функцию transclude, чтобы точно указать angular, что вы хотите сделать!   -  person jpmorin    schedule 09.10.2013
comment