У мене є директива з isolate-scope (щоб я міг повторно використовувати директиву в інших місцях), і коли я використовую цю директиву з an ng-repeat
, вона не працює.
Я прочитав всю документацію та відповіді Stack Overflow на цю тему та розумію проблеми. Я вважаю, що я уникав усіх звичних прийомів.
Тож я розумію, що мій код виходить з ладу через область дії, створену ng-repeat
директивою. Моя власна директива створює isolate-scope і робить двосторонню прив'язку даних до об'єкта в батьківській області. Моя директива призначить нове значення об’єкта цій прив’язаній змінній, і це чудово працює, коли моя директива використовується без ng-repeat
(батьківська змінна оновлюється правильно). Однак, ng-repeat
присвоювання створює нову змінну в області ng-repeat
дії, а батьківська змінна не бачить змін. Все це, як очікувалося, виходячи з прочитаного.
Я також читав, що коли для даного елемента існує кілька директив, створюється лише одна область дії. І що priority
в кожній директиві можна встановити a, щоб визначити порядок, в якому директиви застосовуються; директиви сортуються за пріоритетом, а потім викликаються їх функції компіляції (шукайте слово пріоритет за адресою http://docs.angularjs.org/guide/directive ).
Тому я сподівався, що зможу використовувати пріоритет, щоб переконатися, що моя директива запускається першою і в кінцевому підсумку створює isolate-scope, а при ng-repeat
запуску вона повторно використовує isolate-scope замість того, щоб створювати область, яка прототипно успадковується від батьківської області. У ng-repeat
документації зазначено, що ця директива працює на рівні пріоритету 1000
. Незрозуміло 1
, вищий рівень пріоритету чи нижчий. Коли я використовував рівень пріоритету 1
в своїй директиві, це не мало значення, тому я спробував 2000
. Але це погіршує ситуацію: мої двосторонні прив’язки стають, undefined
і моя директива нічого не відображає.
Я створив скрипку, щоб показати свою проблему . Я прокоментував priority
налаштування в моїй директиві. У мене є список об'єктів імен та директива, name-row
яка відображає поля першого та прізвища в об'єкті імені. Коли клацне відображене ім'я, я хочу, щоб воно встановило selected
змінну в основній області. Масив імен, selected
змінна передається name-row
директиві за допомогою двостороннього прив'язки даних.
Я знаю, як змусити це працювати, викликаючи функції в основній області. Я також знаю, що якщо selected
всередині іншого об'єкта, і я прив'язуюсь до зовнішнього об'єкта, все буде працювати. Але мене на даний момент ці рішення не цікавлять.
Натомість у мене є такі запитання:
- Як я не можу
ng-repeat
створити область, яка прототипно успадковується від батьківської області, і замість цього вона використовує isolate-scope моєї директиви? - Чому рівень пріоритету
2000
в моїй директиві не працює? - Використовуючи Batarang, чи можна дізнатися, який тип сфери використовується?
ng-repeat
. Я думаю, що цінно мати можливість поєднувати окремі директиви з ng-repeat
. Продовження ...
ng-repeat
не повинна мати області дії. ng-repeat
наявність сфери дійсно має сенс для типового випадку використання, тому я не пропоную її змінювати. Натомість, як я прокоментував у відповіді Алекса Осборна, я думаю, що буду створювати повторювану директиву на основі ng-repeat
, яка не створює власного обсягу. Потім це можна використовувати для повторення директив, які мають свої власні сфери ізоляції. Продовження ...
ng-repeat
чи користувальницьку директиву повторення без обсягу. Я думаю, це нормально, якщо "абонент" знає це, але це не нормально, якщо "викликає" (директива повторюється) знає, повторюється вона чи ні. Продовження ...
scope: true
для вашої директиви. Див. Також (якщо ви ще цього не зробили) stackoverflow.com/questions/14914213/... Крім того, те, що директива буде використовуватися в кількох місцях, не означає, що ми повинні автоматично використовувати область ізоляції.