web-dev-qa-db-ja.com

TypeError:読み取り専用プロパティに割り当てようとしました。 iOS8 SafariのAngularjsアプリケーション

私たちのモバイルアプリは「TypeError:読み取り専用プロパティへの割り当てを試みました」を取得しています。 IOS 8のみで、スタックトレースは役に立たず、Angularコードにあるようです。

これは、Angularjsコードの最上位の「厳密な使用」が原因で発生している可能性があります。私の質問は(1)IOS8でのみ発生し始めたのはなぜですか?これはIOS8のバグですか? (2)またはangularバグがIOS8で表面化したか?(3)または、厳密なモードのルールに違反しているが、IOS8だけがルールをキャッチし始めた!3番目のオプションについては、 ストリクトモードがサポートされています 他の主要なブラウザ。

同様の報告された問題が1つ見つかりました こちら

16
Sara Navidpour

これは IOS8バグのようです

少なくともember.jsの担当者は、コードが修正されるまで一時的にコードから 'use strict'を削除します。 Ember.jsの問題

11
Daniel Riquelme

[〜#〜]ソリューション[〜#〜]-注:

  1. angular.copyが機能しませんでした
  2. lodash cloneDeepも機能しませんでした。
  3. 「厳格な使用」の削除。役に立たなかった-読み取り専用の値への「誤った」割り当てを回避するtry/catchに記録されているエラーが削除された

私たちにとって、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);
});
5

このエラーが発生しただけで、修正は非常に簡単でした。

私のコードは-

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

割り当てでTypeErrorが発生します。 $scope.data.somedataをどこにも定義していないため、$scope.dataundefinedを取得し、そこにプロパティを割り当てようとしたため、エラーが発生しました。

コントローラーの上部に$scope.data = {somedata : [] }を置くだけです。 $scope.data.somedata$scope.somedataに変更することで、このエラーを取り除くこともできます。これは、$scopeオブジェクトのプロパティであるundefined$rootscopeになるためです。エラーは発生しません。これは私のビューモデルをデバッグするのがかなり難しいことがわかりました。また、このTypeErrorについては、何が間違っているのかを見つけることができます。

0
maksbd19

形にしていただきました。私の問題は、SQL戻りオブジェクトを入力にバインドしたことが原因でした。 angular.copy()に対処した後、問題は解決しました。

戻り値をコピーして再試行してください。

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