2014-09-25 12 views
16

Nasza aplikacja mobilna otrzymuje "TypeError: Próba przypisania do właściwości" tylko do odczytu ". tylko na IOS 8 i ślady stosu nie są pomocne i wydają się być w kodzie Angular.TypeError: Próba przypisania do właściwości tylko do odczytu. w aplikacji Angularjs na iOS8 Safari

To może się zdarzyć z powodu "użycia ścisłego" na najwyższym poziomie kodu Angularjs. Moje pytania to (1) dlaczego zaczęło się to dziać tylko w IOS8? czy to jest błąd IOS8? (2) czy jest to usterka kątowa wyświetlana na IOS8? (3) A może naruszamy zasady trybu ścisłego, ale tylko IOS8 zaczął je łapać! Jestem sceptyczny co do trzeciej opcji, ponieważ strict mode is supported przez inne główne przeglądarki.

Znalazłem jeden podobny zgłoszony problem here.

+1

Widzenie tego samego problemu z Angular 1.2.26 na iOS 8. Dziwne jest to, że występuje tylko przez pewien czas. –

+0

Czy próbowałeś używać Google Chrome na IOS8? –

+1

Nadal występujące z 1.2.26? Widziałeś ten raport o problemie? https://github.com/angular/angular.js/issues/9128 (Podobne do tego zatwierdzenia: https://github.com/shunjikonishi/angular.js/commit/b91f34103974047708145e971506f354f804c17c) – Nicolas

Odpowiedz

10

Wygląda na to, że jest to IOS8 bug

Przynajmniej faceci w ember.js tymczasowo rozebrać do „use strict” z ich kodu, dopóki nie jest ustalona. Ember.js issue

0

Miałem go z formularzem. Mój problem polegał na powiązaniu obiektu SQL Return z danymi wejściowymi. po rozwiązaniu problemu z metodą angle.copy().

spróbuj skopiować swoje wartości zwrotne i spróbuj ponownie.

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

5

ROZWIĄZANIE - Uwaga:

  1. angular.copy nie działa mi
  2. lodash cloneDeep nie działało.
  3. usunięcie "użyj ścisłego"; nie pomogło - Po prostu usunęło błąd, który był rejestrowany w próbie/złapaniu całego "błędnego" przypisania do wartości tylko do odczytu.

Dla nas wartość, która była przekazywana z obietnicy SQL, była tablica obiektów.

Wartości, na które otrzymywaliśmy błąd "tylko do odczytu", były ciągami znaków, cyframi i liczbami.

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

Pomyślałem, dobrze, jeśli nie można przypisać wartości do właściwości na tych obiektów w tablicy, dlaczego nie można po prostu skopiować wszystkie wartości obiektów? Przypisanie obiektów jest przez odniesienie, więc samo wykonanie pętli przez tablicę nie pomoże. Musisz zapętlić klawisze i wartości.

to rozwiązać nasz problem

// 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); 
}); 
0

miałem tylko ten błąd i poprawka była dość prosta.

mój kod was-

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

otrzymuję TypeError w przeznaczeniem.Ponieważ nie zdefiniowałem $scope.data.somedata w dowolnym miejscu i uzyskałem $scope.dataundefined i próba przypisania do niego właściwości, zainicjowała błąd.

Po prostu umieszczam $scope.data = {somedata : [] } w górnej części kontrolera. Mogę też pozbyć się tego błędu, zmieniając $scope.data.somedata na $scope.somedata, ponieważ każda właściwość obiektu $scope, która jest undefined, zakończy się na $rootscope i nie spowoduje żadnego błędu. Zauważyłem, że bardzo trudno jest debugować mój model widoku. A także dla tego TypeError mogę dowiedzieć się, co dokładnie jest nie tak.

Powiązane problemy