16

モバイル アプリで「TypeError: Attempted to assign to readonly property.」が発生します。IOS 8 のみで、スタック トレースは役に立たず、Angular コードにあるようです。

これは、Angularjs コードの最上位レベルの「use strict」が原因で発生している可能性があります。私の質問は (1) なぜ IOS8 でのみ発生し始めたのですか? これはIOS8のバグですか?(2) それとも、これは IOS8 で表面化した角度のあるバグですか? (3) あるいは、厳密なモードのルールに違反しているのに、IOS8 だけがそれらをキャッチし始めたのかもしれません! 厳密モードは他の主要なブラウザーでサポートされているため、3 番目のオプションには懐疑的です。

ここ で報告された同様の問題を 1 つ見つけました。

4

4 に答える 4

11

これはIOS8のバグのようです

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

于 2014-12-10T12:56:10.087 に答える
5

解決策- 注:

  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');

配列内のこれらのオブジェクトのプロパティに値を割り当てることができない場合、すべてのオブジェクトの値をコピーできないのはなぜでしょうか? オブジェクトの割り当ては参照によるものであるため、配列をループするだけでは役に立ちません。キーと値をループする必要があります。

これで問題は解決しました

// 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);
});
于 2016-03-28T04:14:26.383 に答える
0

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

私のコードは-

    $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のプロパティが最終的に になり、エラーが発生しないためです。ビューモデルをデバッグするのはかなり難しいことがわかりました。また、この TypeError についても、正確に何が間違っているかを見つけることができます。$scopeundefined$rootscope

于 2016-07-18T08:50:14.787 に答える
0

フォームでいただきました。私の問題は、SQL Return Object を入力にバインドしたことが原因でした。angular.copy()問題解決に対処した後。

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

$scope.yourFunc= function(result) {
        var item = angular.copy(result.rows.item(0));
        ...
    };
于 2016-01-24T11:58:36.637 に答える