在javascript缩小后,我只在prod(它在dev中工作)获得Error: Grid argument is not a Grid object
。
我深入研究了ui.grid的代码,我最初的想法是有一个错误但是因为似乎没有人抱怨我认为我做错了。
我认为它是由缩小造成的错误的原因:
这里发生错误,其中dev中的n是'Grid'类型的函数,但是在缩小后它的类型为'h'
if ("Grid" !== t.type(n))
throw new Error("Grid argument is not a Grid object");
t.type使用Function.prototype.toString获取函数的类型。类型的名称在缩小期间已更改,并且不等于“Grid”作为上述条件
h.type = function(e) {
var t = Function.prototype.toString.call(e.constructor);
return t.match(/function (.*?)\(/)[1]
我正在使用Rails 4,最新版本的angular和ui.grid。
虽然我认为这是无关紧要的,但这是我的代码:
查看:
<div ng-controller="SummonersCtrl">
<p>
<strong>Name:</strong>
<span>{{summoner.name}}</span>
</p>
<p>
<strong>Region:</strong>
<span>{{summoner.region}}</span>
</p>
<div id="rune-statistics">
<h2>Runepage Usage</h2>
<p>Stats of {{summoner.sumOfGames()}} games.</p>
<div ui-grid="gridOptions" class="stats-grid"></div>
</div>
</div>
控制:
runestats = angular.module('runestats')
summonersCtrl = runestats.controller 'SummonersCtrl'
, ['Summoner', 'backendApi', '$rootScope', '$scope', '$http', '$log'
, (Summoner, backendApi, $rootScope, $scope, $http, $log) ->
$scope.summoners = []
$scope.gridOptions =
data: 'summoner.total_runestats'
backendApi.getSummoners().success (data) ->
$scope.summoners = data
$rootScope.$on 'summonerSearched', (event, name, region) ->
backendApi.getSummoner(name, region).success (data) ->
$scope.summoner = new Summoner(data)
$rootScope.$broadcast('summonerFound', name, region)
]
这是一个错误,还是我做错了什么?
答案 0 :(得分:0)
这个答案可能取决于你用于缩小的内容,但很多工具都有一个名为“mangle”的设置,它可以解释在缩小过程中类型名称的变化。
where n in dev is a function of type 'Grid', but after being minified its of type 'h'
请参阅答案 here ,了解一些工具(特定链接示例使用Grunt)如何在默认情况下缩小 mangle 代码以节省额外的字节数。所以关闭mangle并且n应该保持Grid类型的函数而不是被修改为类型h。如何再次关闭损坏将取决于您用来缩小的工具。
当然,作为一种解决方案/最后的手段,如果您无法关闭损坏功能,则另一个选项是跳过该文件的缩小。如果在缩小项目之前手动将文件重命名为以-min.js或.min.js结尾,则应跳过该文件,因为它将被假定为已缩小。