Подтвердить что ты не робот

TypeError: Попытка назначить свойство readonly. в приложении Angularjs на Safari iOS8

Наше мобильное приложение получает "TypeError: Попытка назначить свойство readonly". только на IOS 8 и трассировки стека не помогают и, кажется, находятся в коде Angular.

Это может происходить из-за "строгого использования" на верхнем уровне кода Angularjs. Мои вопросы: (1) почему это началось только на IOS8? это ошибка IOS8? (2) или это ошибка Angular появилась на IOS8? (3) Или, может быть, мы нарушаем правила строгого режима, но только IOS8 начал их поймать! Я скептически отношусь к третьему варианту, потому что строгий режим поддерживается другими основными браузерами.

Я нашел один подобный сообщенный вопрос здесь.

4b9b3361

Ответ 1

Похоже, что это ошибка IOS8

По крайней мере, ребята из ember.js временно отменит "использование строгого" кода, пока он не будет исправлен. Проблема с Ember.js

Ответ 2

РЕШЕНИЕ - Примечание:

  • angular.copy не работает для меня
  • lodash cloneDeep тоже не работает.
  • удаление "use strict"; не помогло - он просто удалил ошибку, регистрируемую в try/catch arround "ошибочное" присвоение значения readonly

Для нас значение, возвращаемое из значения обещания SQL, было массивом объектов.

Значения, на которые мы получали ошибку "только для чтения", были строками, bools и числами.

console.log('this will log');
sqlReturnArray[0].name = "Bob"; // read only error here
console.log('wouldnt get to here to log');

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

Это решило нашу проблему

// where sqlReturnArray is the object given from the SQL promise
var newArrayOfObjects = [];
angular.forEach(sqlReturnArray, function (obj) {
  var newObj = {};
  angular.forEach(obj, function (val, key) {
    newObj[key] = val;
  });
  newArrayOfObjects.push(newObj);
});

Ответ 3

У меня было это с формой. моя проблема была связана с привязкой возвращаемого объекта SQL к вводу. после устранения проблемы angular.copy().

попробуйте скопировать ваши возвращаемые значения и повторить попытку.

$scope.yourFunc = function (result) {           var item = angular.copy(result.rows.item(0));           ...       };

Ответ 4

У меня просто была эта ошибка, и исправление было довольно простым.

Мой код был -

    $http.get('/api/v1/somedata').then(function(result){
        $scope.data.somedata = result.data.list;
    });

Я получаю TypeError в назначении. Поскольку я не определил $scope.data.somedata где-нибудь и получил $scope.data undefined и попытался присвоить ему какое-либо свойство, он инициировал ошибку.

Я просто положил $scope.data = {somedata : [] } в верхнюю часть контроллера. Я также могу избавиться от этой ошибки, изменив $scope.data.somedata на $scope.somedata, потому что любое свойство объекта $scope, которое undefined, закончится до $rootscope и не даст никакой ошибки. Я обнаружил, что довольно сложно отладить мою модель представления. А также для этого TypeError я могу узнать, что именно не так.