有人可以解释一下为什么简单的优化在 AngularJS 中对我来说失败了吗?更重要的是,我怎样才能让他们工作?(也欢迎定义控制器的最佳实践/澄清)。
这是我的场景,大大简化了。
我正在使用这个 HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html ng-app="">
<head>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/excite-bike/jquery-ui.css" type="text/css" rel="stylesheet" />
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js" type="text/javascript"></script>
<script src="simple_script.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js" type="text/javascript"></script>
<script>
//inline JS here
$(function() {
var spinner = $( "#qtySpinner" ).spinner({
spin: function( event, ui ) {
scope.qty = ui.value;
scope.$digest();
//console.log( event );
}
}); //end spinner
var scope = angular.element(spinner).scope();
});
</script>
<title>Angular Testing</title>
</head>
<body>
<div ng-controller="InvoiceCntl">
<b>Invoice:</b><br>
<br>
<table>
<tr>
<td>
Quantity
</td>
<td>
Cost
</td>
</tr>
<tr>
<td>
<input id="qtySpinner" type="integer" min="0" ng-model="qty" required="">
</td>
<td>
<input type="number" ng-model="cost" required="">
</td>
</tr>
</table>
<hr>
<b>Total:</b> {{calculate(qty,cost)}}
</div>
<br>
</body>
</html>
我正在使用这个高度缩小的证明(我认为)JS文件作为“simple_script.js”,它实际上是这样工作的:
//this works
window["InvoiceCntl"] = function ($scope) {
$scope["qty"] = 1;
$scope["cost"] = 19.95;
$scope["calculate"] = function (xval, yval) {
return xval * yval;
};
}
使用带有 SIMPLE_OPTIMIZATIONS的 Google Closure Compiler ( http://closure-compiler.appspot.com/home ) 进行缩小,我得到了这个,它打破了:
//this breaks, seemingly because "a" replaces "$scope"?
window.InvoiceCntl=function(a){a.qty=1;a.cost=19.95;a.calculate=function(a,b){return a*b}};
我认为这是因为$scope
Angular 寻找的一个关键词(依赖注入?),因为当我手动添加额外的步骤,在函数的第一行传递$scope
和分配它时a
,它起作用了。像这样:
//manually passing "$scope" and immediately assigning it to "a" works
window.InvoiceCntl=function($scope){var a=$scope;a.qty=1;a.cost=19.95;a.calculate=function(a,b){return a*b}};
- 为什么
$scope
在这种情况下不像正常的函数参数? - 有没有一种方法可以使用 Closure 编译器(或其他东西)来缩小(简单或高级)角度代码,而无需像这样的手动步骤?
- 是
$scope
可配置的还是固定的关键字,即,我可以在定义控制器时将关键字更改为“$myscope”吗?(不确定这对我有帮助)
谢谢。