2014-09-25 57 views
16

我們的移動應用程序正在「TypeError:試圖分配給只讀屬性。」只有在IOS 8和堆棧跟蹤沒有幫助,似乎是在Angular代碼。TypeError:試圖分配給只讀屬性。在iOS8上的Angularjs應用程序Safari

這可能是因爲Angularjs代碼頂級的「嚴格使用」而發生的。 我的問題是(1)它爲什麼只發生在IOS8上?這是一個IOS8的錯誤? (2)或者這是IOS8上出現的角度錯誤? (3)或者我們違反了嚴格的模式規則,但只有IOS8開始抓住它們!我對第三個選項持懷疑態度,因爲其他主流瀏覽器的strict mode is supported

我發現了一個類似的報告問題here

+1

在iOS 8上看到與Angular 1.2.26相同的問題。奇怪的是,它只發生在一些時間。 – 2014-10-22 11:44:24

+0

您是否曾嘗試在IOS8上使用Google Chrome? – 2014-10-22 12:40:20

+1

仍然發生在1.2.26?你看過那個問題報告嗎? https://github.com/angular/angular.js/issues/9128(與此提交相關:https://github.com/shunjikonishi/angular.js/commit/b91f34103974047708145e971506f354f804c17c) – Nicolas 2014-11-14 16:33:56

回答

10

看起來這是一個IOS8 bug

至少在ember.js的球員將暫時剝離,直到它固定在「使用嚴格的」從他們的代碼。 Ember.js issue

0

我用它的形式。 我的問題是因爲將SQL返回對象綁定到輸入。 解決了angular.copy()問題。

嘗試複製您的返回值並重試。 $ scope.yourFunc = function(result){ var item = angular.copy(result.rows.item(0)); ... };

5

SOLUTION - 注:

  1. angular.copy沒有工作對我來說
  2. lodash cloneDeep也不能工作。
  3. 刪除「嚴格使用」;沒有幫助 - 它只是刪除了錯誤記錄在錯誤分配到一個只讀值周圍的錯誤

對於我們來說,從SQL承諾值傳回的值是一個對象數組。

我們獲得「只讀」錯誤的值是字符串,布爾值和數字。

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

我只是有這個錯誤並修復是相當簡單的。

我的代碼是 -

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

我得到的分配類型錯誤。因爲我沒有在任何地方定義$scope.data.somedata,所以得到$scope.dataundefined並試圖分配一些屬性給它發起錯誤。

我只是把$scope.data = {somedata : [] }放在控制器的頂部。我也可以通過將$scope.data.somedata更改爲$scope.somedata來消除此錯誤,因爲$scope對象的任何屬性將爲undefined將最終爲$rootscope,並且不會給出任何錯誤。我發現這很難調試我的視圖模型。而且對於這個TypeError,我可以找出究竟是什麼錯誤。

相關問題