2014-09-25 11 views
16

La nostra app mobile sta ricevendo "TypeError: Tentativo di assegnare alla proprietà readonly". solo su IOS 8 e le tracce dello stack non sono utili e sembrano essere in codice angolare.TypeError: Tentativo di assegnare alla proprietà readonly. nell'applicazione Angularjs su iOS8 Safari

Questo potrebbe accadere a causa del "use strict" al livello superiore del codice Angularjs. Le mie domande sono (1) perché è iniziato a verificarsi solo su IOS8? questo è un bug IOS8? (2) o si tratta di un bug angolare emerso su IOS8? (3) O forse stiamo violando le regole della modalità rigorosa ma solo IOS8 ha iniziato a catturarle! Sono scettico sulla terza opzione perché strict mode is supported da altri principali browser.

Ho trovato un problema simile segnalato here.

+1

Vedere lo stesso problema con Angular 1.2.26 su iOS 8. La cosa strana è che si verifica solo una volta. –

+0

hai provato a utilizzare Google Chrome su IOS8? –

+1

Ancora in corso con 1.2.26? Hai visto quel rapporto? https://github.com/angular/angular.js/issues/9128 (correlato a questo commit: https://github.com/shunjikonishi/angular.js/commit/b91f34103974047708145e971506f354f804c17c) – Nicolas

risposta

10

Sembra che questo è un IOS8 bug

Almeno i ragazzi di ember.js verranno temporaneamente striscia la 'uso rigoroso' dal loro codice finché non è risolto. Ember.js issue

0

L'ho avuto con un modulo. il mio problema era legato al binding di un oggetto di ritorno SQL a un input. dopo aver risolto il problema con angular.copy().

provare a copiare i valori restituiti e riprovare.

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

5

SOLUZIONE - Nota:

  1. angular.copy non ha funzionato per me
  2. lodash cloneDeep non ha funzionato neanche.
  3. rimozione "use strict"; non ha aiutato - E 'appena rimosso l'errore viene registrato in un try/catch arround l'assegnazione "erroneo" ad un valore in sola lettura

Per noi, il valore che veniva passato nuovamente dal valore SQL promessa era un matrice di oggetti.

I valori su cui si otteneva l'errore di "sola lettura" erano stringhe, bool e numeri.

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

ho pensato, bene, se non posso assegnare valori di proprietà su tali oggetti all'interno della matrice, perché non posso semplicemente copiare tutti i valori degli oggetti? L'assegnazione degli oggetti è per riferimento, quindi non fare altro che eseguire un ciclo sull'array. È necessario eseguire il loop delle chiavi e dei valori.

Questo risolto il nostro problema

// 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

Ho appena avuto questo errore e la correzione è stata piuttosto semplice.

My Code era-

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

ho la TypeError nella assegnare.Perché non ho definito $scope.data.somedata ovunque e ha ottenuto $scope.dataundefined e tentando di assegnare alcune proprietà all'avvio dell'errore.

Ho semplicemente inserito $scope.data = {somedata : [] } nella parte superiore del controller. È inoltre possibile eliminare questo errore modificando $scope.data.somedata a $scope.somedata poiché qualsiasi proprietà dell'oggetto $scope che è undefined terminerà fino al $rootscope e non fornirà alcun errore. Ho scoperto che è abbastanza difficile eseguire il debug del mio modello di visualizzazione. E anche per questo TypeError posso scoprire cosa è esattamente sbagliato.

Problemi correlati