2016-11-06 107 views
-1
$scope.updateCart = function() { 

    item = $scope.productData; 

此代碼段返回IE 11的功能,而不是對象。IE 11的角度範圍回報函數,而不是對象

使用https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js

上一頁標題:IE 11的jquery '參數不可選' 錯誤

以下代碼:

dt = $.param({ 
      shopid: shop_id, 
      mtd: method, 
      item: item 
     }); 

拋出以下錯誤:

TypeError: Argument not optional 
    at add (https://code.jquery.com/jquery-1.9.1.js:7340:4) 
    at buildParams (https://code.jquery.com/jquery-1.9.1.js:7392:3) 
    at jQuery.param (https://code.jquery.com/jquery-1.9.1.js:7360:4) 
    at $scope.updateBACart (http://127.0.0.1:6636/js/baCartNg.js?v=1478430971:104:3) 
    at fn (Function code:2:216) 
    at expensiveCheckFn (http://code.angularjs.org/1.5.5/angular.js:15485:11) 
    at callback (http://code.angularjs.org/1.5.5/angular.js:25018:17) 
    at Scope.prototype.$eval (http://code.angularjs.org/1.5.5/angular.js:17229:9) 
    at Scope.prototype.$apply (http://code.angularjs.org/1.5.5/angular.js:17329:13) 
    at Anonymous function (http://code.angularjs.org/1.5.5/angular.js:25023:17) 

錯誤或者扔在IE 11而不是在鉻

根據https://docs.angularjs.org/api/ng/service/ $ httpParamSerializerJQLike

我更改代碼:

dt = $httpParamSerializerJQLike({ 
      shopid: shop_id, 
      mtd: method, 
      item: item 
     }); 

現在的代碼不會引發錯誤,但請求是

item: %0Afunction+item()+%7B%0A++++%5Bnative+code%5D%0A%7D%0A 
    mtd: add 
    shopid: 1 

而不是項目數據。

+0

從去年片斷的輸出,它看起來像你的'item'變量實際持有一個*函數*。也許你只是忘了調用函數,例如像'var item = elements.item'應該是'var item = elements.item(0)'?嘗試在該行前添加一個'console.log(item)',看看在瀏覽器的控制檯中記錄了什麼。 –

+0

我注意到,這是我從NG範圍得到的值 - 這在IE 11中是錯誤的(vs chrome) –

+0

奇怪的是IE和Chrome會有所不同。我認爲你需要向我們展示更多的代碼,這樣其他人才能更好地理解你的變量發生了什麼。 –

回答

1

當然,你可以命名的item您的變量,而不是item1,並且會爲現在的工作......但沒有按告訴你什麼是錯誤與你的原始代碼。

The real問題是您將分配給全局變量而不是本地變量。當您使用:

function() { 
    item = (2 + 2); // or some other value 
} 

不使用var item在它之前,你實際上是分配給一個全球變量item。在瀏覽器方面,在全球範圍內是window對象,因此上述等同於:

function() { 
    window.item = (2 + 2); 
} 

在Chrome中,沒有任何問題:最初沒有window.item,所以這個任務創建它。但在IE11中,window已具有item屬性,並且它是只讀!這意味着對全局item變量的所有分配都將被忽略,因此window.item始終具有其原始函數值。

您的「解決方案」通過使用不同的變量名稱來解決此問題。一個更好,更強大,更高效的解決方案是使用局部範圍變量來代替:

function() { 
    var item = (2 + 2); // does NOT create a global item variable 
} 

作爲一個很好的做法,確保您總是使用var聲明一個新的變量的時候,要避免意外創建全局變量。更好的是,爲你的函數添加一個"use strict"指令,以便這些類型的賦值拋出錯誤而不是默默地忽略錯誤。

如果你真的需要創建一個全局變量,明確分配給屬性的window對象本身:

function() { 
    window.globalItem = (2 + 2); 
} 
0

的解決方案是item1 = $scope.productData;代替item = $scope.productData;

出於某種原因,IE11設置itemfunction item() { [native code] }

+0

我明白髮生了什麼事。既然你使用'item = ...'而不是'var item = ...',你的代碼試圖分配一個**全局**變量'item'。在Chrome上,這不是問題,因爲沒有'window.item'。 IE似乎有一個'window.item'函數,它是**只讀**。這意味着你使用'item = ...'的賦值實際上*失敗*,稍後閱讀'item'仍然會給你最初的'window.item'。簡而言之,** real **問題是您的變量泄漏到全局範圍 - 使用'var'! –