私たちのモバイルアプリは「TypeError:読み取り専用プロパティへの割り当てを試みました」を取得しています。 IOS 8のみで、スタックトレースは役に立たず、Angularコードにあるようです。
これは、Angularjsコードの最上位の「厳密な使用」が原因で発生している可能性があります。私の質問は(1)IOS8でのみ発生し始めたのはなぜですか?これはIOS8のバグですか? (2)またはangularバグがIOS8で表面化したか?(3)または、厳密なモードのルールに違反しているが、IOS8だけがルールをキャッチし始めた!3番目のオプションについては、 ストリクトモードがサポートされています 他の主要なブラウザ。
同様の報告された問題が1つ見つかりました こちら 。
これは IOS8バグのようです
少なくともember.jsの担当者は、コードが修正されるまで一時的にコードから 'use strict'を削除します。 Ember.jsの問題
[〜#〜]ソリューション[〜#〜]-注:
私たちにとって、SQL promise値から返された値はオブジェクトの配列でした。
「読み取り専用」エラーが発生していた値は、文字列、ブール、および数値でした。
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);
});
このエラーが発生しただけで、修正は非常に簡単でした。
私のコードは-
$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については、何が間違っているのかを見つけることができます。
形にしていただきました。私の問題は、SQL戻りオブジェクトを入力にバインドしたことが原因でした。 angular.copy()
に対処した後、問題は解決しました。
戻り値をコピーして再試行してください。
$scope.yourFunc= function(result) {
var item = angular.copy(result.rows.item(0));
...
};