Angular.js: (iOS 8 GM iPhone5C) TypeError: попытка назначить свойство только для чтения

Созданный на 17 сент. 2014  ·  163Комментарии  ·  Источник: angular/angular.js

Я использую iOS 8 GM (iPhone5C).
С этим устройством я получаю эту ошибку в этой строке (https://github.com/angular/angular.js/blob/master/src/ng/rootScope.js#L216)
Но на iOS 8 GM (iPhone5S) и iOS 7.x (iPhone5C, iPhone5S) эта ошибка не возникает.

Чтобы устранить эту ошибку, я переписал код следующим образом:

$new: function(isolate) {
        var child;

        if (isolate) {
          child = new Scope();
          child.$root = this.$root;
          // ensure that there is just one async queue per $rootScope and its children
          child.$$asyncQueue = this.$$asyncQueue;
          child.$$postDigestQueue = this.$$postDigestQueue;
        } else {
          // Only create a child scope class if somebody asks for one,
          // but cache it to allow the VM to optimize lookups.
          if (!this.$$ChildScope) {
            this.$$ChildScope = function ChildScope() {
              this['$$watchers'] = this['$$nextSibling'] =
                  this['$$childHead'] = this['$$childTail'] = null;
              this['$$listeners'] = {};
              this['$$listenerCount'] = {};
              this['$id'] = nextUid();
              this['$$ChildScope'] = null;
            };
            this.$$ChildScope.prototype = this;
          }
          child = new this.$$ChildScope();
        }
        child['this'] = child;
        child['$parent'] = this;
        child['$$prevSibling'] = this.$$childTail;
        if (this.$$childHead) {
          this.$$childTail.$$nextSibling = child;
          this.$$childTail = child;
        } else {
          this.$$childHead = this.$$childTail = child;
        }
        return child;
      },

Ситуация улучшилась, но не понимаю в чем причина ...

Lots of comments iOS more info bug

Все 163 Комментарий

Какую версию angular вы тестировали? Появляется ли это просто при включении angular или при определенных обстоятельствах (код вашего приложения)?

Я тестировал AngularJS v1.2.25.

Код моего приложения ниже.

шаблон страницы

...
<card-item-list ng-repeat="card in cards track by $index" data-card="card"></card-item-list>

директива card-item-list

...
var cardItemList = function() {
    var link = function(scope) {};
    return {
      restrict: 'E',
      replace: true,
      templateUrl: 'templates/card/directives/list-item.html',
      scope: {
        card: '=',
      },
      link: link
    };
  };
  cardItemList.$inject = [];
...
<div class="card--list__item">
  <div ng-class="{'card--list__item_state_check': card.isSelect}">
    <card-thumb data-card="card"></card-thumb>
  </div>
  <p class="card--list__item__detail fs_xxs">
    <span ng-if="card.parameter.attack > 0">{{card.parameter.attack}}<br>&nbsp</span>
    <span ng-if="card.parameter.defense > 0">{{card.parameter.defense}}<br>{{card.parameter.speed}}</span>
  </p>
</div>

директива card-thumb

...
var cardThumb = function() {
    return {
      restrict: 'E',
      replace: true,
      transclude: true,
      templateUrl: ''templates/card/directives/card-thumb.html',
      scope: {
        card: '=',
        opts: '=?'
      },
      link: function(scope, element){
      }
    };
  };
 cardThumb.$inject = [];
...
<figure class="thumb thumb_type_1">
  <img class="thumb__img" ng-src="{{card.image_path}}"  ng-if="card.master_id">
  <figcaption class="thumb__caption" ng-transclude></figcaption>
</figure>

@christianv, не могли бы вы собрать http://plnkr.co/ или http://jsbin.com/, чтобы воспроизвести это?

Я посмотрю, смогу ли я воспроизвести это на моем ipad или iphone 6 (но, судя по тому, что вы сказали, похоже, что я не смогу :()

@caitp Я думаю, ты хотел известить кого-то еще.

да, я имел в виду @HAKASHUN , извини

удалите 'use strict' и попробуйте

мы получаем ту же проблему, и код @HAKASHUN исправил проблему для нас

У нас такая же проблема.

Я применил код @HAKASHUN «с до v1.2.26

https://github.com/shunjikonishi/angular.js/commit/b91f34103974047708145e971506f354f804c17c

Когда я включаю angular.js, он отлично работает.
Но с angular.min.js это не работает.

Я надеюсь решить эту проблему как в обычной, так и в миниатюрной версии.

Мы также столкнулись с этой ошибкой с несколькими разными iPad, все под управлением iOS 8. Я могу получить точные номера моделей, если кому-то интересно. Мы пробовали сборки с версиями Angular: 1.2.24, 1.3.0 и 1.3.1.

Исправление @HAKASHUN сработало, по крайней мере, в отладочных (неминифицированных) сборках.

@shunjikonishi, это всего лишь предположение (я имею дело с той же проблемой), но, возможно, ваш минификатор делает что-то вроде принудительной записи через точку? Это эффективно отменит это исправление. Я пробовал одну минификацию с помощью uglify (2.4), и это сломало исправление, и теперь я изучаю свое предположение. Возможно, я могу попросить uglify уважать точечную нотацию, или, может быть, я ошибаюсь.

_Обновить_

Кто-нибудь еще использует $ route?

Также @shunjikonishi в моем случае uglifyjs принудительно использовал точечную нотацию, эффективно отменяя исправление. Если вы используете grunt / uglify, это что-то вроде: uglify: {options: {properties: false}}

не могли бы вы быстро воспроизвести это? Я бы хотел увидеть это на моем телефоне

@caitp Я посмотрю, что я могу сделать. Мне нужно позаботиться о неожиданной работе, но это важно, так что, надеюсь, ко дню у меня будет плункер.

_Обновить_

@caitp Я сделал плункер, чтобы попытаться воспроизвести эту проблему, и потерпел неудачу.

Если кому-то интересно взглянуть на мою попытку воспроизведения плункера, то он здесь: http://plnkr.co/edit/EPsxhO1OsD5MmnUyl50t?p=preview Я начал с простого щелчка, обновляя $ scope, затем попробовал изменить $ route (это где я могу последовательно воспроизводить в своем приложении), а затем попробовал повторы и повторить в ng-if.

Позже я уделю этому больше времени.

@ bennett000 Спасибо за совет.

Я просто использовал вывод команды пакета grunt.

Теперь я включаю в свой проект задачу uglify angular. Работает нормально.

Есть одно исправление.
Формат опций grunt-contrib-uglify такой.

uglify: {
    options: { 
        compress: {
            properties: false 
        }
    }
}

Это также влияет на Angular v1.3.0; мы видели его на устройстве iOS8 в нашем офисе, но страница, на которой он находится, выдает ошибку непоследовательно (что-то, что мы исследуем).

Применение патча @shunjikonishi приводит к тому, что страница не ломается в этих условиях, но также приводит к тому, что на странице появляется «undefined» там, где этого не должно быть, и не удаляется.

Возможно, не самый полезный набор деталей, но это результат первоначального расследования. Мы можем копать глубже; просто хотел отметить, что v1.3.0 тоже затронута.

привет ребята, пока ждем репродукции =)

(так что предоставьте, пожалуйста)

@caitp абсолютно, последовательное воспроизведение ошибки имеет важное значение.

Странно то, что я могу последовательно воспроизвести это в своем приложении, как и другие; но воспроизвести в плунжере мне не удалось. Я счастлив продолжить работу над воспроизведением этого в примере, но мне бы очень хотелось получить более подробную информацию от других людей, у которых есть эта проблема.

В нашем случае:

  • Веб-приложение "сохраняется" на главном экране iOS.
  • Веб-приложение запускается с главного экрана iOS
  • Веб-приложение прерывается после нескольких вызовов $ location.path ()

Известные номера моделей iDevice:

  • MD528C / A
  • MD516C / A
  • MF432C / A

Мне интересно, есть ли разница, запускается ли приложение с домашнего экрана iOS, а не в iOS Safari, или в WebView, или в WKView; так было в более старых версиях iOS.

Я буду больше работать над плунжером, а также возьму код плункера и превращу его в автономное приложение, чтобы я мог посмотреть, смогу ли я воспроизвести его при «сохранении» на главном экране iOS.

Опять же, будет полезна любая дополнительная информация об их проблемах, имеющаяся у кого-либо еще.

_Обновить_

Удаление существующего материала plunkr, который я сделал, в полноценное веб-приложение для домашнего экрана iOS, похоже, не дало никакого дополнительного эффекта.

Кто-нибудь еще использует какие-либо пользовательские жесты или делает что-то особенное, чтобы избежать таких вещей, как прокрутка отскока в iOS?

Удаление 'use strict'; решило проблему для меня (iPhone 5C iOS 8.1).

В течение последних нескольких недель мне по-прежнему не удавалось воспроизвести эту проблему в контролируемой среде, как у plunkr. Кроме того, другие обходные пути, в том числе удаление «use strict», мне не помогают. Очевидно, что без контролируемого воспроизведения этой проблемы начинать ее решение некуда. Однако мне пришло в голову, что Angular поставляется со своим собственным набором модульных тестов; как эти тесты работают на моих устройствах?

  • Angular.js коммит: 9a616eade4386341e51f993fe8824840ea96a8e9
  • В Ubuntu 12.04 запущен Chromium 37.0.2062 _все тесты пройдены_
  • На iOS 7.1.2 под управлением мобильного Safari 7.0.0 (модель MF432C / A) _все тесты пройдены_
  • На iOS 8.1.1 при запуске мобильного Safari 8.0.0 (модель MD528C / A) один тест не проходит

Mobile Safari 8.0.0 (iOS 8.1.1) private mocks createMockStyleSheet should allow custom styles to be created and removed when the stylesheet is destroyed FAILED Expected '0px' to be '2px'. ~/Workspaces/angular.js/test/helpers/privateMocksSpec.js:23:47

Я предполагаю, что этот неудавшийся тест не имеет отношения.

Опять же, любой, у кого есть предложения о том, как воспроизвести ошибку iOS 8 только для чтения, был бы полезен. Я знаю, что у других_ фреймворков были похожие проблемы с назначением свойств только для чтения в iOS8.x, но они не помогли мне воспроизвести. Вот ссылки, которые ссылаются на _схожие_ проблемы, с которыми столкнулись некоторые другие

Другие шаги, которые я предпринял для смягчения этой проблемы, заключались в том, чтобы прочесать весь наш источник и источник _every_ библиотеки, который мы используем, чтобы найти все, что может установить свойство только для чтения. Это включает в себя grepping для:

  • Object.create ()
  • заморозить
  • записываемый
  • настраиваемый
  • defineProperty

Есть ли что-нибудь еще, что может заставить JavaScript выдавать ошибку типа только для чтения? Невозможность воспроизвести это не помогает моему рассудку.

Мы тоже сталкиваемся с этим.
Мы смогли воспроизвести проблему только на реальном устройстве (в нашем случае IPhone 5C) с версией IOS до 8.1 (мы тестируем 8.0.2, и проблема постоянно повторяется).

Это довольно серьезная проблема, есть ли способ ее обойти?

(Мы на Angular 1.3.6, обновлено сегодня, проблема все еще сохраняется)

@ m3kka удалось изолировать проблему? Будет очень сложно перейти к этому, не сузив его предварительно.

Потратил день на поиски способа воспроизвести ошибку в контролируемой среде, но, к сожалению, все еще не нашел решения.

Я немного расширил обходной путь @HAKASHUN, поэтому, если кому-то нужен пост - notSoGood - исправьте, это то, что я сделал.

_AngularJS_ вер.

RootScope
https://github.com/angular/angular.js/blob/master/src/ng/rootScope.js#L208
Из:

          if (!this.$$ChildScope) {
            this.$$ChildScope = function ChildScope() {
              this.$$watchers = this.$$nextSibling =
                  this.$$childHead = this.$$childTail = null;
              this.$$listeners = {};
              this.$$listenerCount = {};
              this.$id = nextUid();
              this.$$ChildScope = null;
            };

К:

          if (!this['$$ChildScope']) {
            this['$$ChildScope'] = function ChildScope() {
              this['$$watchers'] = this['$$nextSibling'] =
                  this['$$childHead'] = this['$$childTail'] = null;
              this['$$listeners'] = {};
              this['$$listenerCount'] = {};
              this['$id'] = nextUid();
              this['$$ChildScope'] = null;
            };

https://github.com/angular/angular.js/blob/master/src/ng/rootScope.js#L221
Из:

        child.$parent = parent;
        child.$$prevSibling = parent.$$childTail;

К:

        child['$parent'] = parent;
        child['$$prevSibling'] = parent.$$childTail;

Компилировать
https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L1375
Из:

transcludedScope.$$transcluded = true;

К

transcludedScope['$$transcluded'] = true;

До сих пор я не могу помочь вам с дополнительной информацией, буду продолжать изучать проблему.

Я понял это. iOS умирает на этой строчке:

              this.$$watchers = this.$$nextSibling =
                  this.$$childHead = this.$$childTail = null;

Когда я разбил это на отдельные операторы, я обнаружил, что ошибка была вызвана тем, что сначала было назначено this.$$watchers . Следующее работало правильно:

              this.$$childTail = null;
              this.$$childHead = null;
              this.$$nextSibling = null;
              this.$$watchers = null;

Я подозреваю, что iOS неправильно выполняет порядок назначения, что вызывает ошибку. Я не знаю, где еще эта разница в синтаксисе могла вызвать ошибки, но подозреваю, что это имеет далеко идущие последствия.

@Wasmoo Вау, это звучит странно. Сможете ли вы изолировать эту штуку на минимальном примере, в идеале в плункере? Если так, то это определенно проблема со стороны браузера.

@ pkozlowski-opensource К сожалению, нет. Я только что столкнулся с ошибкой в ​​проекте, над которым работаю, и я понятия не имею об ее источнике (jQuery выдает что-то в Angular). Как и в моем проекте, вы должны нажимать только нужные элементы в правильном порядке, чтобы произошла ошибка, но это и только это изменение решает мою проблему.

Надеюсь, кто-то еще, у кого возникает ошибка, может подтвердить исправление.

Мы сталкиваемся с этой проблемой на «тяжелой» странице, заполненной несколькими областями и шаблоном, упрощение этого в плункере кажется действительно сложным: /

Я попробую исправить @Wasmoo, через пару минут

Нет, @Wasmoo не решает проблему в нашей кодовой базе.

:-( Грусть!
Я также подтвердил, что iOS выполняет присваивание в этом синтаксисе в правильном порядке:

    j.a = j.b = j.c = 0;

эквивалентно

    j.c = 0;
    j.b = 0;
    j.a = 0;

Так что это опровергает эту теорию, хотя я не могу объяснить, почему мое исправление работает для меня.

Как бы то ни было, мой проект все еще не работает - мое исправление только переместило ошибку, поэтому она не работает точно так же в какой-то другой момент.

@Wasmoo , применив мой обходной путь, вы сможете удалить проблему (все же вам придется поддерживать следующие версии angular)

@ m3kka Работает как по волшебству!

@ m3kka будет ли это означать, что Safari на iOS не любит точечный доступ к свойствам, начинающимся с $ ? Хм, должно быть что-то еще происходит ...

Вот патч обезьяны, который я создал, чтобы не изменять исходный код angular.js напрямую. Пользуюсь им последние несколько недель, проблем больше нет. Он был основан на angular 1.3.3.

https://gist.github.com/jhunken/767cdf62ecc9f31c56da

К сожалению, мне также не удалось воспроизвести эту проблему на минимальном примере.

Если кто-то ищет решение без использования исправленной версии Angular, вы можете попробовать следующее.

У меня была пара вложенных контроллеров состояния для ui-router, и я заметил, что ошибка вызывалась парой строк, которые обращались к переменным в родительской области. В попытке получить доступ к этим переменным, не просматривая область видимости, я настроил свой контроллер, используя синтаксис Controller as . Благодаря этому я мог напрямую обращаться к переменным без необходимости перемещаться по областям.

Не уверен, что это сработает для всех, но мое приложение больше не выдает ошибку.

@ pkozlowski-opensource Я думаю, что IOS каким-то образом испортил свойство readonly на объектах js. Очевидно, доступ к элементам с «ключевой нотацией» (не может вспомнить фактическое имя) игнорирует этот беспорядок.

Также очевидно, что Angular не единственный, кто затронут этой проблемой - http://craigsworks.com/projects/forums/showthread.php?tid=3649

@jhunken Ты заставил меня

У меня та же проблема. Предлагаемый обходной путь, кажется, решил эту проблему. Я использую декоратор @jhunken .

Вопрос новичка: что означает эта проблема, находящаяся на этапе чистилища? Звучит не очень хорошо.

Мне еще предстоит воспроизвести это, и я потратил много времени на попытки. Однако я рад сообщить, что патч обезьяны @jhunken _ кажется_ решил мои проблемы на данный момент. Я с нетерпением жду возможности выяснить, почему это работает, так как я потратил так много времени, проходя через этот процесс снова и снова, без каких-либо результатов.

Добавление некоторых деталей, которые, вероятно, сами по себе бесполезны, но ... На iOS 8.1.2 iPad 2 и mini я видел «TypeError: Попытка назначить свойство только для чтения». Это большое приложение, так что сложно попасть в plunkr.

У нас была проблема, которая постоянно появлялась при использовании Angular 1.3.7 (мы удалили 'use strict' из min-файла для v1.3, чтобы исправить ту же проблему, но не удалили его после обновления). В прошлый раз ошибка появлялась в другом месте приложения и была менее последовательной. На этот раз у нас были шаги репродукции, чтобы сделать это по запросу. Удаление «use strict» из angular.min.js устранило проблему. Последним шагом перед ошибкой было изменение маршрута (мы используем стандартный маршрутизатор: ngRoute). В нашем случае это привело к сетке данных без данных, а сообщения не были переведены (с использованием директивы translate из pascalprecht.translate). Повторное переключение маршрута с использованием того же раскрывающегося списка или обновление заставит страницу снова заработать.

Я считаю, что это ошибка мобильного сафари, потому что мы не видим ее ни в одном другом браузере.

Похоже, это ошибка iOS 8 - http://stackoverflow.com/a/27401601

В журналах ошибок bugsnag для моего приложения я также вижу, что только в мобильном сафари с iOS 8.0 и 8.1

Ниже приведена трассировка стека для angular 1.2.28. Та же проблема существует и для 1.2.24.

TypeError Attempted to assign to readonly property.
    angular.js:12188:37 $$childScopeClass
    angular.js:12198:8 prototype
    angular.js:6161:29 
    angular.js:6773:35 controllersBoundTransclude
    angular.js:21409:16 link
    angular.js:6752:19 nodeLinkFn
    angular.js:6146:23 compositeLinkFn
    angular.js:6746:35 nodeLinkFn
    angular.js:6954:36 
    angular.js:8171:13 
    angular.js:11682:81 wrappedCallback
    angular.js:11768:34 
    angular.js:12811:28 prototype
    angular.js:12623:36 prototype
    angular.js:12915:12 prototype
    angular.js:19264:29 
    angular.js:2853:14 
    angular.js:325:22 forEach
    angular.js:2852:12 eventHandler

Есть ли еще какое-нибудь исправление для этого, кроме удаления «строгого использования»? Я хотел бы использовать CDN angular, и это отключило бы его ...

изменить: использование сути работает. Извини за это

У меня тоже сработало исправление Monkey. Очевидно, это не лучшее решение, и это ошибка, которая выходит из angular в продакшене. Похоже, что ios8 webkit действительно не любит присваивать переменные. $$

Для некоторой информации мне пришлось исправить compile.js, так как моя фаза компиляции директив была заблокирована.

transcludedScope['$$transcluded'] = true;

Внесение некоторых изменений из точечной нотации в нотацию скобок с помощью исправления обезьяны, например @jhunken, тоже

По-прежнему нет ни слова об официальном решении?

Удаление строгого использования сделало это для меня. Тем не менее, все еще жду официального решения.

@rjbernaldo Чтобы уточнить,

@hamstu Я удалил его только из angular.js.

Удаление 'use strict'; устранило проблему на моей стороне. Я совершенно убежден, что Apple пытается убить веб-приложения с помощью подобных сбоев. знак равно

Удаление 'use strict'; действительно остановило сбои, но, похоже, вызвало другую проблему: теперь мое приложение, кажется, зависает, а не падает, и вкладка в Safari перестает отвечать. Это даже происходит в симуляторе iOS, и процесс симулятора начинает использовать 200% ЦП на моем Mac.

Это случилось с кем-нибудь еще?

не могли бы вы опубликовать трассировку сбоя в стеке вместе с версиями всех используемых вами библиотек? это было бы полезно.

Ой, погоди, я вижу, что это ... вау, я не думаю, что это правильное поведение в ЗАО, просто чтобы проверить ...

Мне не удалось воспроизвести это на моем iphone, ipad или любом из симуляторов ios, которые я пробовал. Мне кажется, что проблема в том, что свойство prototype неправильно определено как недоступное для записи в JSC, что было бы ошибкой (и объяснило бы, почему оно больше не воспроизводится, если они его исправили). Если проблема не в этом, пожалуйста, предоставьте нам репродукцию.

Мне кажется, что ошибка, создающая эту проблему, https://bugs.webkit.org/show_bug.cgi?id=138038 (опубликована в предыдущем ответе @edzis)

@ m3kka мы не используем O.create в версии 1.2.x

В нашей ситуации эта проблема началась, когда мы перешли в ветку 1.3.x, в исходном коде которой я могу найти несколько экземпляров Object.create ()

Я полностью сбился с пути?

Исходный отчет об ошибке (и большинство комментариев) указывают на то, что это влияет на версию 1.2.x

в любом случае, если у кого-то возникла эта проблема, предоставьте копию: <

Вот что я получаю от консоли Safari симулятора iOS на iPhone 5 под управлением iOS 8.0. Это с AngularJS v1.3.13.

[Error] Error: Attempted to assign to readonly property.
ChildScope<strong i="6">@http</strong>://localhost:9000/bower_components/angular/angular.js:13682:42
$new<strong i="7">@http</strong>://localhost:9000/bower_components/angular/angular.js:13690:40
boundTranscludeFn<strong i="8">@http</strong>://localhost:9000/bower_components/angular/angular.js:7092:40
controllersBoundTransclude<strong i="9">@http</strong>://localhost:9000/bower_components/angular/angular.js:7756:35
ngRepeatAction<strong i="10">@http</strong>://localhost:9000/bower_components/angular/angular.js:24502:26
$watchCollectionAction<strong i="11">@http</strong>://localhost:9000/bower_components/angular/angular.js:14110:21
$digest<strong i="12">@http</strong>://localhost:9000/bower_components/angular/angular.js:14243:31
$apply<strong i="13">@http</strong>://localhost:9000/bower_components/angular/angular.js:14506:31
done<strong i="14">@http</strong>://localhost:9000/bower_components/angular/angular.js:9659:53
completeRequest<strong i="15">@http</strong>://localhost:9000/bower_components/angular/angular.js:9849:15
requestLoaded<strong i="16">@http</strong>://localhost:9000/bower_components/angular/angular.js:9790:24
  (anonymous function) (angular.js, line 11607)
  (anonymous function) (angular.js, line 8557)
  $digest (angular.js, line 14261)
  $apply (angular.js, line 14506)
  done (angular.js, line 9659)
  completeRequest (angular.js, line 9849)
  requestLoaded (angular.js, line 9790)

@pascalc отлично, теперь предоставлю репродукцию =)

Использование AngularJS v1.2.22
Ошибка: попытка назначить свойство только для чтения.
$$ childScopeClass @ http : //XXX/bower_components/angular/angular.js: 12037: 23
$ новый @ http : //12wbt-frontend.dev/bower_components/angular/angular.js: 12045: 45
композитныйLinkFn @ http : //XXX/bower_components/angular/angular.js: 6067: 38
композитныйLinkFn @ http : //XXX/bower_components/angular/angular.js: 6089: 24
композитныйLinkFn @ http : //XXX/bower_components/angular/angular.js: 6089: 24
композитныйLinkFn @ http : //XXX/bower_components/angular/angular.js: 6089: 24
nodeLinkFn @ http : //XXX/bower_components/angular/angular.js: 6686: 35
композитныйLinkFn @ http : //XXX/bower_components/angular/angular.js: 6086: 23
publicLinkFn @ http : //XXX/bower_components/angular/angular.js: 5982: 45
http: //XXX/assets/scripts/app.js : 51874: 49

а код в app.js - '$ compile (element.contents ()) ($ scope);' . Ошибка воспроизводится на Ipad Safari с IOS Simulator. Комментирование «строгого пользователя» также исправляет ошибку.

@ chriswu14, пожалуйста, предоставьте дополнительно репродукцию, спасибо!

Также вижу проблему. Тем не менее, не уверен, насколько успешен или даже полезен запрос на «воспроизведение», в свете того факта, что этот феномен кажется очень специфичным для определенных установок. Например. Я столкнулся с этим только с ui-router , дочерними пользовательскими состояниями и представлениями И симулятором iOS iphone 5 .

Удалите любую из переменных, и все работает нормально, причем ключевой проблемой, по-видимому, является iPhone5 sim.

IPhone 4S и 5S работают как шарм, как и iPad2 / retina sim.

Я согласен. Более одного человека безуспешно пытались воспроизвести это в контролируемой среде (включая меня), я думаю, это не будет исправлено в ближайшее время.

Я испытываю ту же проблему на iPhone 6, работая с Ionic
фреймворк

Во вторник, 17 марта 2015 г., в 19:50, Марко Визинтин [email protected]
написал:

Я согласен. Более одного человека пытались воспроизвести это в контролируемой
среда неудачно (я в том числе), я думаю, это не будет исправлено в любое время
скоро.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/angular/angular.js/issues/9128#issuecomment -82496015.

У меня тоже такая же проблема с симулятором iphone 6 под управлением iOS 8.2

У меня такая же проблема на моем iPad (3-го поколения) под управлением iOS 8.2 (12D508) с удаленным ведением журнала. И проблема исчезает, когда я удаляю "use strict" из исходного кода angular.js. Кто-нибудь уведомил об этом Apple?

Без воспроизведения маловероятно, что к этой проблеме кто-то может относиться серьезно, и те (относительно) немногие из нас, кого затронула проблема, в основном нашли альтернативные решения. Время от времени я выкладываю время, чтобы попытаться воспроизвести, и ничего не добиваюсь.

Я столкнулся с проблемой на всех версиях iOS> = 8.0.0, но только на некоторых моделях. Я пробовал несколько версий Angular в строках 1.2.x и 1.3.x, вплоть до 1.3.14 - я не сталкивался с проблемой ни в одном из моих модульных тестов или тестах компонентов e2e - только в одном конкретном приложении, обычно при изменении маршрута и только после того, как приложение поработает некоторое время.

Решение jhunken мне очень понравилось. Используя его _unminified_, у меня вообще нет проблем. Однако минификации с помощью Uglify и Closure Compiler нарушают исправление. У меня еще не было времени попробовать исключить декоратор из процесса минификации и запустить его ...

просто fwiw, это нормально, если воспроизведение не является "минимальным", хотя проще, тем лучше --- вы можете ссылаться на затронутое приложение (в идеале с минимальными требованиями к серверной части, чтобы нам было проще создать воспроизведение с помощью)

@caitp Я постоянно это вижу здесь . Если вы нажмете «крестик» в правом верхнем углу экрана, я получу описанную ошибку (и основная часть экрана станет белой - она ​​должна перейти на другую страницу). Обратите внимание, что этого не происходит в симуляторе iOS, но, используя iOS 8.2 на iPhone 5, я могу воспроизводить каждый раз.

@iainbeeston Я не могу

Я очистил кеш, и это все еще происходит на моем iPhone 5.

Я также только что тестировал iPhone 6 (также iOS 8.2), и, как вы сказали, он там работает правильно. Так что, похоже, это характерно для iPhone 5x (не уверен в iPhone 4x).

Я собираю ошибки Angular JS со своего веб-сайта и вижу эту ошибку на случайных iPad и iPhone в зависимости от пользовательского агента.

Я пытался воспроизвести это на iPhone 5, iPad mini2 и iPad air и не могу воспроизвести это.

@iainbeeston Я пробовал это на своем iPad, но я не был на 100% уверен, что вы имели в виду под крестиком - могу ли я предположить, что на планшете макет другой?

В любом случае, нажатие на несколько вещей, включая переключаемое меню, и «x» не вызывают ошибок на моем пэде, IIRC моя мини-модель - MD528C / A

Возможно, это влияет только на iphone 5 и ранее.

В среду, 25 марта 2015 г., в 16:35 Майкл Беннет [email protected]
написал:

@iainbeeston https://github.com/iainbeeston Я пробовал это на своем iPad, но
Я не был на 100% уверен, что вы имели в виду под крестиком - могу ли я предположить, что макет
разные на планшете?

В любом случае, нажав на несколько вещей, в том числе на переключающееся меню и на 'x'
не выдает ошибок на моем планшете, IIRC моя модель mini - MD528C / A

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/angular/angular.js/issues/9128#issuecomment -86107019.

Я попросил члена семьи с iphone 5 (никаких дополнительных сведений о модели №, но привет) на iOS 8.2, чтобы попробовать его, и они отправили обратно скриншоты, которые, похоже, работают нормально. Это похоже на какую-то ошибку, возможно, стоит сообщить об этом как об ошибке в самом Safari.

Эй, это интересно. Теперь работает и у меня (мы обновили код с тех пор, как
тогда, может быть, несвязанное изменение исправило это?)

Есть ли у кого-нибудь еще сайт, который может достоверно воспроизвести проблему?
В среду, 25 марта 2015 г., в 16:59, ⭐caitp⭐ [email protected] написал:

Я спросил члена семьи с iphone 5 (никаких дополнительных сведений о
модель #, но эй) на iOS 8.2, чтобы попробовать, и они отправили обратно скриншоты,
похоже, работает нормально. Это похоже на гейзенбаг, может быть
стоит сообщить об этом как об ошибке в самом Safari

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/angular/angular.js/issues/9128#issuecomment -86121113.

У меня есть воспроизводимый сценарий на веб-сайте, над которым я работаю, но я могу поделиться данными для входа только в частном порядке. Пожалуйста, дайте мне свой адрес электронной почты, чтобы я мог выслать вам детали.

@caitp У меня все еще проблема. Если вы перейдете на ту же страницу, что и раньше , затем щелкните стрелку в верхней левой стрелке (которая загружает предыдущую страницу), затем стрелку в правом верхнем углу (которая возвращает на исходную страницу), я получаю ошибку довольно надежно.

photo 02-04-2015 3 08 25 pm

Если это не произойдет сразу, попробуйте несколько раз щелкнуть вперед и назад (просто щелкните стрелки, но не крестик). Вы можете сказать, что произошла ошибка, потому что изображение больше не появляется.

photo 02-04-2015 3 13 29 pm

Это iPhone 5 (A1429) , работающий под управлением iOS 8.2 и мобильное сафари 8.0 (useragent Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4 )

как объяснялось, я не могу воспроизвести это на 3 разных устройствах iOS или на любом из устройств симулятора iOS.

Я думаю, вам следует зарегистрировать это как ошибку в webkit или связаться с Apple. Никто мало что может сделать, если мы сами не увидим ошибку.

Извините, я просто подумал, что более подробное объяснение поможет воспроизвести ошибку.

Стоит ли тогда закрывать этот вопрос?

Мне кажется, что эта ошибка случайна на устройствах и версиях iOS. У меня есть несколько устройств, и я не могу воспроизвести ошибку, но я знаю, что некоторые люди на моем веб-сайте действительно сталкиваются с этой проблемой, потому что я вижу сообщения об ошибках.

Я бы предположил, что в этих обстоятельствах, возможно, что-то связано с конфигурацией устройств, некоторыми настройками или, возможно, каким-то другим установленным программным обеспечением, которое вызывает конфликт.

Очевидно, что для многих это проблема. Тот факт, что он не воспроизводится в контролируемой среде, на мой взгляд, не препятствует реализации каких-либо исправлений данной проблемы. Похоже, есть обезьяна-патч , решающий проблему. Если указанный патч-обезьяна не вызывает каких-либо других поддающихся проверке проблем (в модульных тестах и ​​т. Д.), Я действительно не понимаю причин, по которым он не применяется и не устраняет проблему для всех.

Если указанный патч-обезьяна не вызывает каких-либо других поддающихся проверке проблем (в модульных тестах и ​​т. Д.), Я действительно не понимаю причин, по которым он не применяется и не устраняет проблему для всех.

отправить PR =)

@caitp написал:

отправить PR =)

Я бы предпочел, чтобы @jhunken, как автор упомянутого патча обезьяны, мог это сделать. :)

@asbjornu Мне посчастливилось воспользоваться патчем jhunken, но в моем случае, патч обезьяны не работал после минификации. Если моя проблема такая же, как у других людей; принятие этого патча не обязательно что-нибудь исправит.

Если я смогу опубликовать нашу демонстрацию, мы сможем воспроизвести ее на других устройствах. Впрочем, этого может не хватить еще на месяц. Также есть шанс, что недавний выпуск iOS 8.3 устранил эту проблему, но у меня еще не было возможности протестировать.

Привет, @spencerwi , вы догадались, почему при применении патча появляется слово "undefined"? Вы нашли какое-нибудь другое решение? Спасибо

@totemika @spencerwi со своей стороны мы просто избавляемся от "undefined", изменяя способ использования перевода, например

он не работал, используя:

<h2 translate="'GETTING_STARTED_HEADLINE"></h2>

Работает с:

<h2>{{ 'GETTING_STARTED_HEADLINE' | translate }}</h2>

@brauliodiez @spencerwi Полностью сработало: +1:

@ bennett000, кстати, я только что

Чтобы быть ясным, я получаю его с патчем обезьяны или без него на iPad 4G (2012) под управлением iOS 8.3 и iOS 8.1.3. Это не всегда воспроизводимо - иногда просто присоединение его к отладчику Safari, работающему на Mac, исправляет его, но иногда он все равно идет не так, когда прикреплен (что, по крайней мере, позволяет мне прочитать трассировку исключения).

Вы используете angular translate?

@brauliodiez - я использую angular-translate yes - и angular-ui-router, который на самом деле находится в трассировке стека ниже.

angular#1.3.15
angular-translate#2.4.2
angular-ui-router#0.2.13
Error: Attempted to assign to readonly property.
ChildScope<strong i="9">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:13617:34
$new<strong i="10">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:13759:40
compositeLinkFn<strong i="11">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:7096:38
nodeLinkFn<strong i="12">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:7763:35
compositeLinkFn<strong i="13">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:7117:23
compositeLinkFn<strong i="14">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:7120:24
compositeLinkFn<strong i="15">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:7120:24
nodeLinkFn<strong i="16">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:7763:35
compositeLinkFn<strong i="17">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:7117:23
compositeLinkFn<strong i="18">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:7120:24
publicLinkFn<strong i="19">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:6996:45
http://<hostname_redacted>/2/vendor/angular-ui-router/release/angular-ui-router.js:3905:13
invokeLinkFn<strong i="20">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:8258:15
nodeLinkFn<strong i="21">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:7768:23
compositeLinkFn<strong i="22">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:7117:23
publicLinkFn<strong i="23">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:6996:45
updateView<strong i="24">@http</strong>://<hostname_redacted>/2/vendor/angular-ui-router/release/angular-ui-router.js:3839:34
http://<hostname_redacted>/2/vendor/angular-ui-router/release/angular-ui-router.js:3801:21
$broadcast<strong i="25">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:14785:33
http://<hostname_redacted>/2/vendor/angular-ui-router/release/angular-ui-router.js:3218:32
processQueue<strong i="26">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:13248:29
http://<hostname_redacted>/2/vendor/angular/angular.js:13264:39
$eval<strong i="27">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:14466:28
$digest<strong i="28">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:14282:36
$apply<strong i="29">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:14571:31
done<strong i="30">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:9698:53
completeRequest<strong i="31">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:9888:15
requestLoaded<strong i="32">@http</strong>://<hostname_redacted>/2/vendor/angular/angular.js:9829:24 <div ui-view="main" class="ng-scope">

Изменить: просто обновили до angular-ui-router # 0.2.14, angular-translate # 2.6.1, и проблема остается.

@pascalc При удалении "use strict" я также вижу, что браузер зависает через 5-10 минут.
angularjs-1.3.15, ios-8.3, iPad-2, ui-router-0.2.13

Какие-либо другие способы решения этой проблемы для вас? Любая помощь приветствуется.

Проблема с Webkit для того же https://bugs.webkit.org/show_bug.cgi?id=49739

Я использую материал angular и получаю то же «Ошибка: попытка назначить свойство только для чтения». почти всегда на моем iPad с iOS 8.3 (первая сетчатка). Патч обезьяны для меня проблему не решает. Кроме того, удаление "use strict" в angular и angular-material еще хуже. В удаленном отладчике safari больше нет сообщений об ошибках, но страница загружается только по частям - из ng-repeat половина элементов отображается случайным образом правильно, другая половина отображается с {{...}} как обычный текст.

Может быть, кто-нибудь сможет использовать мой тестовый пример http://v2.atocc.de/testcase, просто нажмите «öffnen» на одной из перечисленных диаграмм на iPad - я всегда получаю 4 раза «Ошибка: попытка назначить свойство только для чтения». примерно в 80% из моих многочисленных перезагрузок / попыток - но все же иногда это работает. Тестовый набор отлично работает в настольных браузерах. У меня есть еще одно приложение angular-material без проблем, поэтому я не могу упростить тестовый сценарий.

@gitmh спасибо за воспроизведение, взглянул на мой айпад =)

Это было крайне неприятно, я сожалею о том, что у всех возникли проблемы с поддержкой устройств iOS из-за этой проблемы :(

@gitmh Я пытался какое-то время, но не могу воспроизвести это на iPad (MD787C / A) с iOS 8.3 --- Метод: нажмите кнопки «öffnen» на случайных графиках (независимо от того, находится ли та же кнопка последовательное нажатие или нет, похоже, не влияет).

Если какой-либо гуру WebKit / JSC знает, есть ли какие-либо флаги для принудительной оптимизации (различных типов) даже холодного кода, это может быть полезно для отслеживания этого.

@gitmh Я получаю сообщение об ошибке «Попытка назначить свойство только для чтения» каждый раз, когда нажимаю offnen с имитатором iPad 2 iOS 8.3 (12F69).

У меня такая же проблема в моем приложении Angular :(

Для меня это похоже на проблему с синхронизацией на iPad - мой пример загружает диаграмму с несколькими небольшими частями с множеством ng-привязок. Маленькая диаграмма работает лучше - допустим, в 30% случаев, а большая диаграмма - только в 5% моих попыток. Результатом для пользователя является пустая панель диаграммы в правой части окна. Также редко на стартовой странице тестового набора отображаются только некоторые карточки с кнопками «öffnen», поэтому материальные кнопки кажутся хорошим примером для воспроизведения. Я сделал другие копии, такие как http://v2.atocc.de/testcase2, где я удалил "use strict" в angluar, angular-route, angular-material и angular-aria. Это делает приложение непригодным для использования, но в сафари нет сообщений об ошибках. Добавлен еще один http://v2.atocc.de/testcase3 без использования jquery, чтобы убедиться, что это не проблема. http://v2.atocc.de/testcase4 без jquery, но с "строгим использованием". Я также отключил любое кеширование с заголовками, поэтому в каждом тестовом случае заголовок должен измениться на TESTCASE n.

@gitmh Я согласен, время / нагрузка, похоже, являются триггером. В моем приложении я не вижу этой ошибки, пока не нагружу процессор. Другие условия, упомянутые в этой теме (версия iOS, перевод и т. Д.), Похоже, не связаны, поскольку я видел это на iPad mini, iPad air 2, iPhone 5s и симуляторе на каждой версии iOS 8.x, а также в cordova с помощью UIWebView и WKWebView. У меня нет журнала, что это происходит ни на одном устройстве с момента удаления «use strict». Это также объясняет, почему это чертовски сложно воспроизвести.

Я добавил еще один тестовый пример http://v2.atocc.de/testcase5 с патчем обезьяны от @jhunken, он работает намного лучше, но все же иногда приложение ломается без сообщения об ошибке. Сообщение «Ошибка: попытка назначить свойство только для чтения». сообщения пропали сейчас.

+1 Наткнулся так же, как все описывают.

  1. Я могу подтвердить ошибку с помощью тестового примера @gitmh на моем тестовом iPad MD328FD / A с iOS 8.3.
  2. Мое приложение постоянно сталкивается с этой проблемой. но это закрытая бета-версия, которой можно поделиться только через личку.
  3. Я использую те же зависимости, о которых упоминают другие:
    angular # 1.3.15, angular-ui-router # 0.2.14, angular-translate # 2.4.2
  4. Удаление "use strict" приводит к зависанию сафари при упоминании @pascalc и @bewithjonam

+1 также, я получаю это на нескольких iPhone / iPad, на всех работает какая-то версия iOS 8
За 2 часа до первого сообщения я объединил это в своем bower.json (никаких проблем до этого слияния, и никаких других слияний в тот день не было)

-    "ngCordova": "0.1.14-alpha",
-    "ionic": "1.0.0-rc.3",
-    "mapbox.js": "2.1.6",
+    "ngCordova": "0.1.15-alpha",
+    "ionic": "1.0.0-rc.4",
+    "mapbox.js": "2.1.8",

Вот полные зависимости:

  "dependencies": {
    "ngCordova": "0.1.15-alpha",
    "ionic": "1.0.0-rc.4",
    "angular-animate": "1.3.15",
    "angular-sanitize": "1.3.15",
    "mapbox.js": "2.1.8",
    "leaflet": "0.7.3",
    "rollbar.js": "1.2.1"
  },
  "resolutions": {
    "angular": "1.3.15",
    "angular-animate": "1.3.15",
    "angular-sanitize": "1.3.15"
  }

При обновлении нашего стека мы какое-то время работали без "use strict" и начали попадать в блокировки Safari. В худшем случае пользователям придется выключить и снова включить устройство, чтобы Safari снова начал реагировать.

Я оптимистично настроен сейчас, когда есть постоянное воспроизведение того, что исправление возможно, но в краткосрочной перспективе нашел ли кто-нибудь жизнеспособный обходной путь?

Чтобы внести больший вклад в обсуждение общих зависимостей, мы теперь используем:

{
    ...
    "angular": "~1.3.15",
    "angular-translate": "~2.6.1",
    "ui-route": "0.2.13",
    ...
}

... но мы видели эту проблему до того, как добавили ui-router в наш стек. Это (плюс строки, на которые указывает трассировка стека) заставляет меня думать, что здесь происходит что-то еще с тем, как $scope поддерживается в актуальном состоянии, что просто усугубляется или становится более частым из-за того, как некоторые из эти библиотеки взаимодействуют с ядром Angular.

+1

Я вижу проблему на не 64-битных устройствах под управлением iOS 8. Затронуты iPad 2/3/4, mini и т. Д. НЕ затронутые устройства: iPad Air / Air 2, mini 2/3.

Это ошибка Apple, но поскольку другие фреймворки (Ember, Require и т. Д.) Используют обходные пути, было бы неплохо, если бы Angular также реализовал обходной путь.

Кстати, кто-нибудь знает, где отправлять в Apple подобные ошибки?

Кроме того, я добавлю, что удаление «строгого использования» идет только пока. Как заявил @spencerwi , мы видим, что Safari полностью блокируется, и пользователь должен принудительно выйти.

Это происходит только в Safari на iOS8 (не 64-бит) ... не в Chrome. просто fyi.

Решение @HAKASHUN и @ m3kka по переходу от точечной нотации к массиву сработало. Я не знаю, почему 32-битный Safari захлебывается точечной нотацией в этих строках. Это загадка, которую Apple, вероятно, должна разгадать.

Можно ли ввести обозначение массива в Angular, чтобы решить эту проблему для всех?

Мы (Amplify Education, http://amplify.com) также сталкиваемся с этой проблемой. Мы попытались удалить «use strict», различные изменения в нашем стеке. В настоящее время рассматривает возможность использования этого патча для решения этой проблемы.

Между прочим, мне удалось обезопасить от минификации патч @jhunken decorator , объявив оскорбительные имена свойств как строку var s, а затем сославшись на них в скобках.

var $id = '$id',
    $$childScopeClass = '$$childScopeClass',
    ...

А потом:

...
this[$id] = nextUid();
this[$$childScopeClass] = null;
...

Полная разветвленная суть доступна здесь (по образцу Angular 1.2.23)

@zourtney, спасибо за публикацию, я добавил декоратор в наше приложение, которое производило довольно много связанных с этим трассировок с устройств iOS. Это спасло жизнь, поскольку наше приложение было совершенно непригодным для использования, особенно на iPad. В настоящее время мы используем Angular 1.3.8.
ИЗМЕНИТЬ Я только что проверил, есть ли некоторые различия в методе $new в версии в декораторе и 1.3.8, я собираюсь обновить патч

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

https://github.com/angular/angular.js/blob/bab474aa8b146f6732857c3af1a8b3b010fda8b0/src/ng/compile.js#L1096

this.$attr[key] = attrName = snake_case(key, '-');

скорее всего, это сработает, если будет написано в том же формате, что и в вашем патче

var $attr = '$attr';
this[$attr][key] = attrName = snake_case(key, '-');

Это согласовано с комментариями в этой ветке около 9 декабря 2014 г. https://github.com/angular/angular.js/issues/9128#issuecomment -66314752

К сожалению, в ближайшие дни у меня нет времени, чтобы попытаться создать для этого воспроизводимую среду.
Дополнительная информация для создания воспроизводимой среды: это запускается в "неинтерактивном" вызове, поскольку отправная точка трассировки находится здесь https://github.com/angular/angular.js/blob/v1.3.8/src/ ng / browser.js # L49

Я раздвоил и адаптировал декоратор gist от @zourtney для работы в Angular 1.3.8 здесь: https://gist.github.com/harrastia/4a963e62605f73bbfff2

Чтобы следить за проблемой webkit: https://bugs.webkit.org/show_bug.cgi?id=138038. Похоже, патч уже на подходе.

+1
Удаление «строгого режима» из angular.js просто решает проблему, но все равно происходит случайным образом.

bower.json:

"dependencies": {
    "angular": "1.3.15",
    "angular-route": "~1.3.5",
 }

Я только что столкнулся с этой проблемой на своем рабочем сайте и заметил, что ошибка возникла из-за моей задачи включенной опции

Второй отключил removeOptionalTags , снова все заработало.

PS: Если вы использовали yeoman angular , у вас есть этот вариант настройки.

Я столкнулся с этим сегодня и на своем веб-сайте (Iphone 5 iOS 8). Я использую Angular 1.2.28.

+1 на эмуляторе ios 8, ionic 1.0, angular 1.3.16

Я сталкиваюсь с этой ошибкой только тогда, когда элементы формы заключены в шаблон директивы.
С включением или без него.

в настоящее время у меня есть директива о контактной форме. шаблон html:

<div>
<container h-max="1">
  <column align="left">
    <ng-transclude></ng-transclude>
  </column>
</container>
</div>

и в индексном файле я использую его:

<contact-form css-prefix="contact-form">

     <ng-input form-id="voornaam" class="form-control"></ng-input>
     <ng-input form-id="achternaam" class="form-control"></ng-input>
     <ng-input form-id="bedrijf" class="form-control"></ng-input>
     <ng-input form-id="telefoon" class="form-control"></ng-input>
     <ng-input form-id="email" class="form-control"></ng-input>
     <ng-text-area form-id="vraag" class="form-control"></ng-text-area>
     <button ng-click="sendContactForm()" class="btn btn-primary contact-form-button"><lang parent-id="contact_form" id="button"></lang></button>
    </contact-form>

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

Когда он будет применяться в основной ветке? Любая идея?

@dhyegofernando , спросите у Apple ... ошибка исправлена, но не развернута. см. здесь: https://bugs.webkit.org/show_bug.cgi?id=138038#c19

Мы использовали декоратор @jhunken , но столкнулись с проблемами с идентификаторами области при обновлении до Angular 1.4. Нам удалось обойти это, заключив функцию $ new в блок try catch, вдохновленный этим потоком:
http://stackoverflow.com/questions/13147026/disables-jit-in-safari-6-to-workaround-severe-javascript-jit-bugs

Этот обновленный декоратор патча обезьяны работает для нас:
https://gist.github.com/johgusta/46fb1ecd459dbc3bfdfc

Моя компания выпустила служебную программу, которая переписывает наш код, при этом все присвоения свойств точки заменены на назначения обозначений в скобках.

То есть он переписывает следующий код

object.$$a = 5;

к этому

var __webkitAssign__$$a = '$$a';
object[__webkitAssign__$$a] = 5;

как обходной путь для предотвращения TypeError . Утилита доступна на npm. Это решило проблему «только для чтения» на iOS.

Какое-то время моя компания просто удаляла 'use strict'; , но недавно мы столкнулись со странной ошибкой, когда многократное открытие диалогов из библиотеки дизайна материалов angular приводило к зависанию страницы. Произошла ошибка: Error: null is not an object (evaluating 'parent.$$childTail.$$nextSibling = child') , и я предполагаю, что это каким-то образом привело к бесконечному зацикливанию $digest (таким образом, замораживание).

Мы попытались добавить 'use strict'; обратно, но затем мы начали видеть ошибку «только чтение» точно в то же время, что и вышеупомянутая ошибка. Это наводит меня на мысль, что ссылка null связана с этой ошибкой JIT, и что ошибка не ограничивается (или, надеюсь, _не_) только строгим режимом.

Утилита не идеальна, но, по крайней мере, кажется, что она решает проблему с angular.js распространяемым через bower.

Я убедился, что решение @jacksonrayhamilton прекрасно работает на версии 1.2.26.

Для меня решение @jacksonrayhamilton также безупречно работает на v1.4.1

Я уже упоминал, что исправление AngularJS у меня сработало, в новом проекте этого было недостаточно. Я использовал утилиту, которую опубликовал

Наконец, это было исправлено в webkit https://bugs.webkit.org/show_bug.cgi?id=138038#c21, но потребуется некоторое время, чтобы обновления были на всех телефонах.

Я использую этот патч, и он создал еще одну проблему для angularjs 1.4.3 (ранее я использовал 1.2.28):
Если у вас есть директива с изолированной областью, которая содержит ngRepeat (или другую директиву ng, которая создает новую область), она не будет оценивать какие-либо выражения внутри ngRepeat HTML. Он просто напечатает «текст с {{variableName}}» вместо значения.
Вот в чем проблема:
http://stackoverflow.com/questions/31919921/angularjs-1-4-3-ngrepeat-prints-variablename-instead-of-value-when-used-in

Мы используем:

{
    ...
    "angular": "1.3.1",
    "angular-translate": "2.4.2",
    "ui-route": "0.2.15",
    ...
}

И, как описал @brauliodiez, мы только что избавились от "undefined", изменив способ использования перевода,

от неработающего использования:

<h1 translate>resetPassword.ChangePassword</h1>

работать с:

<h1>{{::'resetPassword.ChangePassword' | translate}}</h1>

Мы не использовали никаких патчей для обезьян и не удалили 'use strict';

+1 об эффективности решения @jacksonrayhamilton с использованием Angular 1.3.16. Также можно подтвердить, что эта проблема в основном нарушает работу приложений, использующих Angular Material.

Решение @johgusta действительно хорошо зарекомендовало себя на нашем веб-сайте, к тому же оно выглядит намного безопаснее, поскольку не переписывает внутреннее устройство Angular.

Вчера я столкнулся с этой проблемой, получил ошибку "только для чтения". но очень странно, что этот баг не всегда появляется. Я использую один и тот же симулятор и исходный код в одном ноутбуке Mac Air, иногда получаю ошибку, иногда нет ошибки вообще.

В настоящее время эта ошибка возникает на iOS 8.4.1, angular 1.4.3. Получение этого только на iPad mini.

@jacksonrayhamilton Я пошел попробовать эту утилиту, но я немного ясно понимаю, «как создать преобразованный angular.webkitassign.js в том же каталоге». Я не уверен, что я там делаю.

@alscheuring , в будущем, пожалуйста, странице "Проблемы" .

webkit-assign предоставляет интерфейс командной строки. Откройте терминал и выполните npm install -g webkit-assign чтобы установить программу. cd в каталог файла, который вы хотите преобразовать. Затем введите webkit-assign FILENAME.js (где «FILENAME.js» следует заменить фактическим именем файла), и программа создаст фиксированную копию файла в том же каталоге.

Большое спасибо решению @jacksonrayhamilton . Сработало отлично. Я использовал патч @jhunken , но, похоже, он только уменьшил частоту возникновения ошибки (все еще кажется, что это происходит случайно).

Решение @jacksonrayhamilton великолепно. Мы трансформируем angular.js с помощью специального загрузчика веб-пакетов:

// webpackConfig.js (an excerpt)

{
  module: {
    loaders: [
      {
        test: /angular\.js$/,
        loader: path.join(__dirname, 'webpack/webkitAssignLoader')
      }
    ]
  }
}
// webkitAssignLoader.js

var webkitAssign = require('webkit-assign');

module.exports = function (source) {
  this.cacheable();
  return webkitAssign(source);
};

Я опубликовал загрузчик @Cinamonas : https://www.npmjs.com/package/webkit-assign-loader

@johgusta @albertogasparin Какую версию Angular вы используете, чтобы утверждать, что это решение (https://gist.github.com/johgusta/46fb1ecd459dbc3bfdfc) работает? Это исправление не работает с Angular-1.4.6.

Решение @johgusta решило мою проблему в angular 1.4.2

Решение @johgusta , похоже, решило наши проблемы в angular 1.4.5

+1, пробовал с 1.4.0, 1.4.6 такая же история. Как я могу грамотно исправить Angular, если я не использую webpack?

Обратите внимание: хотя в отчетах говорится, что это влияет только на IOS8, теперь у меня есть случай, когда это происходит на IOS9.2 (несмотря на использование исправления webkit-assign). Любые идеи?

TypeError: попытка назначить свойство только для чтения.
Mozilla / 5.0 (iPhone; процессор iPhone OS 9_2, например Mac OS X) AppleWebKit / 601.1.46 (KHTML, например Gecko) Версия / 9.0 Mobile / 13C75 Safari / 601.1

Попробую удалить 'use strict', как только у меня будет устройство, которое я могу регулярно тестировать.

@ code-tree Если вы запустили весь код JavaScript на своем сайте через webkit-assign и все еще можете постоянно воспроизводить эту ошибку, вам следует зарегистрировать ошибку в нашем репозитории.

+1, угловой 1.3.6 и 1.4.8, iOS 8.2

@jacksonrayhamilton Повторная попытка на другом устройстве под управлением iOS 9.2 сработала нормально, поэтому я не могу воспроизвести это, но это все же произошло на устройстве, упомянутом ранее (к которому у меня больше нет доступа). Думаю, я подожду и посмотрю, сообщит ли еще кто-нибудь что-нибудь.

Привет всем,

Я тоже, к сожалению, столкнулся с этой проблемой.
Я все еще немного ослеплен поведением:

  • Я не вижу его на каждой странице в моем приложении
  • Я не получаю это все время на этой конкретной странице, только около 50% времени

Кто-нибудь заметил, что это происходит только с конкретным кодом или с проблемами загрузки?

Я изучу решение, предоставленное

С уважением,

Да, это впервые произошло у меня после тестирования на устройстве в течение 30 минут без каких-либо проблем. Внезапно это продолжало появляться на странице индекса, без каких-либо (заметно) отличий от предыдущих 30 минут ...

Привет всем,
Я заметил, что в моем случае это почему-то связано с использованием ng-if.
Я использую ng-if, чтобы скрыть свои страницы, пока не будут выполнены все мои внутренние вызовы, чтобы убедиться, что все данные, используемые директивами, доступны перед их загрузкой.
Удаляя эти ng-if, кажется, что я больше не получаю ошибки readOnly (проверено около 20 раз).
Кто-нибудь еще это заметил?

Есть ли какие-либо негативные побочные эффекты при использовании @jacksonrayhamilton его решения? В настоящее время я использую angular 1.4.7.

@JeroenNelen Хотя возможно, что ngIf может быть виновником, я думаю, что более вероятно, что ngIf предотвратил или запустил какой-то другой код, который был виновником. Что касается эффективности решения, мы используем AST для преобразования и исправления кода, поэтому он должен быть довольно точным. У нас не было никаких проблем с его использованием в нашей производственной сборке, и в настоящее время у нас нет открытых проблем.

@jacksonrayhamilton Спасибо за ответ. Я проверю, возникает ли проблема после этих изменений, если она действительно возникает, я думаю, единственным решением будет использование вашего пакета (кстати, хорошая работа над ним) :).
Странно то, что я не могу добиться появления ошибки на любой другой странице, только на этих конкретных страницах, поэтому я вмешивался в код на этих страницах, чтобы увидеть, могу ли я предотвратить ошибку локально (вместо того, чтобы настраивать anguluar.js) .

@jacksonrayhamilton Привет, есть ли способ использовать ваш инструмент с Grunt?

var webkitAssign = require('webkit-assign');
module.exports = function(grunt) {
  grunt.registerTask('webkitAssign', function() {
    var file = 'build/scripts.js';
    var code = grunt.file.read(file);
    var transformed = webkitAssign(code);
    grunt.file.write(file, transformed);
  });
};

Или для лучшей интеграции, может быть, вы хотите отправить плагин в наш репозиторий? :-)

Мы обнаружили ошибку с angular-translate и ng-show на iOS8. удаление ng-show в пользу ng-if решает проблему. Также проблема, если у родителя есть ng-show. ng-hide, без сомнения, тоже имеет проблемы!

@jacksonrayhamilton Спасибо! Утилита работала безотказно. Проблема больше не сохраняется в iOS 8.3 / iPhone 5, AngularJS 1.4.9. Спустя несколько часов головной боли вы сделали мой день.

@spenoir Я думаю, вы говорите о другой ошибке, касающейся ng-show / ng-hide :
https://github.com/angular/angular.js/issues/13380#issuecomment -181309484

Я столкнулся с той же проблемой. Попробую исправить webkit-assign и доложу.

Поскольку это ошибка в WebKit, которая была установлена , есть работа вокруг , и мы не имеем четкую репродукцию для дальнейшего изучения, это не действенное с нашей стороны.
Закрытие ...

@ code-tree я столкнулся с той же проблемой с тем же описанием (iOS 9, появившаяся после долгого использования). Как исправить свое приложение?

@ celle886 Понятия не имею, извините :)

Похоже, что webkit-assign помогает, но я не смог достоверно воспроизвести проблему.

Только что столкнулся с этой проблемой в нашем веб-приложении с Angular 1.4.8 при использовании iPod / iPhone 8.4.1 в Safari 8.0. Спасибо за того, кто первым предложил webkit-assign. Мы использовали webkit-assign / gulp, и это решило проблему, которая преследовала нас более 6 месяцев.

У меня есть эта проблема с использованием Angular 2 (с Ionic 2) в симуляторе iPhone 6s / iOS 9.2. Появляется сообщение «Exception: TypeError: Attempted to assign to readonly property». Я пробовал решение

У кого-то есть идея как исправить эту проблему?

Спасибо!

@TiagoSilvaPereira Пожалуйста, откройте вопрос об этом в https://github.com/angular/angular . Это репо только для ветки 1.x

Спасибо @Narretsz , я решил эту проблему, удалив из моего кода все "use strinct".

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

brijesh1ec picture brijesh1ec  ·  3Комментарии

ceymard picture ceymard  ·  3Комментарии

WesleyKapow picture WesleyKapow  ·  3Комментарии

ashclarke picture ashclarke  ·  3Комментарии

kishanmundha picture kishanmundha  ·  3Комментарии