誰かが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」に変更できますか? (とにかくそれが私を助けるかどうかわからない)
ありがとう。