16

我们的移动应用程序收到“TypeError: Attempted to assign to readonly property”。仅在 IOS 8 上,堆栈跟踪没有帮助,似乎在 Angular 代码中。

这可能是由于 Angularjs 代码顶层的“使用严格”而发生的。我的问题是(1)为什么它只开始在 IOS8 上发生?这是IOS8的错误吗?(2) 或者这是 IOS8 上出现的一个有角度的错误?(3) 或者也许我们违反了严格的模式规则,但只有 IOS8 开始捕捉它们!我对第三个选项持怀疑态度,因为其他主要浏览器都支持严格模式。

我在这里发现了一个类似的报告问题

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 承诺值传回的值是一个对象数组。

我们得到“只读”错误的值是字符串、布尔值和数字。

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);
});
于 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因为$scope对象的任何属性undefined最终都会出现$rootscope并且不会给出任何错误。我发现这很难调试我的视图模型。而且对于这个 TypeError 我可以找出究竟是什么问题。

于 2016-07-18T08:50:14.787 回答
0

我有一个表格。我的问题是因为将 SQL 返回对象绑定到输入。解决问题后处理angular.copy()

尝试复制您的返回值并重试。

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