【发布时间】:2017-01-12 09:41:47
【问题描述】:
我在 IE 中遇到 2 个错误,而我在 Chrome 或 Edge 中没有。
这可能是特定代码和 IE 的兼容性问题,也可能是我的代码本身导致了错误。
第一个错误:
语法错误(没有具体说明):这行代码:
var groupedArray = Object.keys(groupedObj).sort().map(key=>groupedObj[key]);
第二个错误:
错误:[$injector:unpr] 未知提供者:GroupDateRangeServiceProvider
就像我提到的,我在 Chrome 和 Edge 中都没有遇到这些错误,但我更愿意让网站与 IE 用户兼容。
以下是我的 Angular 工厂/服务的完整代码:
(function () {
'use strict';
angular
.module('portalDashboardApp')
.factory('GroupDateRangeService', GroupDateRangeService);
GroupDateRangeService.$inject = [];
function GroupDateRangeService() {
var service = {
createArray: createArray,
setItemCount: setItemCount,
setSeries: setSeries
};
return service;
function createArray(dateArray, valueArray) {
var arr = dateArray.map(function (s) {
var week = getWeekNumber(parseISOLocal(s));
return week[0] + ('0' + week[1]).slice(-2) + ':' + s;
}).sort();
var results = createGroupedArray(createGroupObject(arr));
if (valueArray && valueArray.length === dateArray.length) {
for (var i = 0; i < results.length; i++) {
results[i] = results[i].map(function (date, index) {
var obj = {};
obj[date] = valueArray[index];
return obj;
});
}
}
var arrayOfWeeks = results;
return results;
}
// Create a Total Count
function setItemCount(dataSet) {
var itemCount = 0;
angular.forEach(dataSet, function (dataItem) {
itemCount = itemCount + dataItem.Total;
});
return itemCount;
};
// Create Chart Series
function setSeries(dataSet, type) {
var series = [{
name: 'Items',
data: [],
showInLegend: false
}];
angular.forEach(dataSet, function (dataItem, dataIndex) {
if (type === 'Count') {
series[0].data[dataIndex] = [dataItem.Description, dataItem.Total];
}
else if (type === 'Percentage') {
series[0].type = 'pie';
series[0].innerSize = '40%';
series[0].data[dataIndex] = [dataItem.Description, dataItem.Percentage];
}
else if (type === 'Adspend') {
series[0].data[dataIndex] = [dataItem.Description, dataItem.Adspend];
}
});
return series;
};
function createGroupObject(arr) {
var groupedObj = arr.reduce(function (result, value) {
var b = value.split(':');
if (!result[b[0]]) result[b[0]] = [];
result[b[0]].push(b[1]);
return result;
}, {});
return groupedObj;
}
function createGroupedArray(groupedObj) {
// Grab arrays in order of week number. Sort keys to maintain order
var groupedArray = Object.keys(groupedObj).sort().map(key=>groupedObj[key]);
// Final set of grouped dates
console.log(groupedArray.join('\n\n'));
return groupedArray;
}
/* Helper to get the ISO week number of a date
** @param {Date} date to get week of
** @returns {Array} [year, weekNumber]
*/
function getWeekNumber(d) {
d = new Date(+d);
d.setHours(0, 0, 0, 0);
d.setDate(d.getDate() + 4 - (d.getDay() || 7));
var yearStart = new Date(d.getFullYear(), 0, 1);
var weekNo = Math.ceil((((d - yearStart) / 86400000) + 1) / 7);
return [d.getFullYear(), weekNo];
}
/* Parse ISO 8601 format date string to local date
** @param {string} s - string to parse like 2016-12-15
** @returns {Date}
*/
function parseISOLocal(s) {
var b = s.split(/\D/);
return new Date(b[0], b[1] - 1, b[2]);
}
}
})();
我将不胜感激!
【问题讨论】:
-
我不明白。你写你希望你的代码与 IE 兼容,但你故意使用在 IE 之后很久就引入的技术。您如何解释这种矛盾?
-
您好 zeroflagL,您是指使用 Angular 还是特定的代码行?我的整个项目都在 IE 中工作,我今天在我创建的新方法和服务中只发现了这两个错误。这就是为什么我要求指导如何解决这个问题。我希望这可以澄清它。
-
你用的是 ES2015 (
key=>groupedObj[key]),比上一版 IE 早两年推出,更不用说老版本了。 -
感谢您的澄清。我确实认为那是问题所在。您可能对用可接受的 JavaScript 版本重写该行有什么建议吗?那将是赢家。 :D
-
function(key) { return groupedObj[key]; }
标签: javascript angularjs google-chrome internet-explorer angular-services