У мене є директива з 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/... Крім того, те, що директива буде використовуватися в кількох місцях, не означає, що ми повинні автоматично використовувати область ізоляції.