TypeError:尝试分配给readonly属性。在iOS8 Safari上的Angularjs应用程序中

时间:2014-09-25 16:55:03

标签: angularjs ios8 strict-mode

我们的移动应用程序正在获取" TypeError:尝试分配给只读属性。"仅在IOS 8上,堆栈跟踪没有帮助,似乎是在Angular代码中。

这可能是因为"使用严格"在Angularjs代码的顶级。 我的问题是(1)为什么它只在IOS8上开始?这是一个IOS8错误吗? (2)或者这是一个在IOS8上浮现的有角虫? (3)或许我们违反了严格的模式规则,但只有IOS8才开始抓住它们!我对第三个选项持怀疑态度,因为其他主要浏览器都是strict mode is supported

我发现了一个类似报道的问题here

4 个答案:

答案 0 :(得分:11)

看起来这是IOS8 bug

至少ember.js的人会暂时从他们的代码中删除'use strict',直到它被修复。 Ember.js issue

答案 1 :(得分:5)

解决方案 - 注意:

  1. angular.copy对我不起作用
  2. lodash cloneDeep也没有工作。
  3. 删除"使用严格&#34 ;;没有帮助 - 它只是删除了在错误的"错误的"中尝试/捕获的错误。分配给只读值
  4. 对于我们来说,从SQL promise值传回的值是一个对象数组。

    我们获得的价值"只读"错误是字符串,bools和数字。

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

答案 2 :(得分:0)

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

尝试复制返回值并重试。

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

答案 3 :(得分:0)

我刚刚遇到此错误,修复非常简单。

我的代码是 -

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

我在assign中得到了TypeError。因为我没有在任何地方定义$scope.data.somedata,而是$scope.data undefined,并尝试为其分配一些属性,从而启动了错误。

我只是将$scope.data = {somedata : [] }放在控制器的顶部。我也可以通过将$scope.data.somedata更改为$scope.somedata来消除此错误,因为$scope undefined对象的任何属性都将以$rootscope结尾,不会给出任何错误。我发现这很难调试我的视图模型。而且对于这个TypeError,我可以找出究竟是什么错误。