0

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

ありがとう。

4

1 に答える 1

2

http://docs.angularjs.org/tutorial/step_05を読む必要があります

「$scope」の注入に関するあなたの懸念は正しいと思います。次のように注入できます。

var module = angular.module('youApp', []);
module.controller('yourCtrl', ['$scope', function($scope) {
   $scope["something"] = "somevalue";
})];

編集:ミニフィケーションの名前が変更$scopeされます。次を追加することでこれを防ぐことができます:

InvoiceCntl.$inject = ['$scope'];
于 2013-02-01T00:10:15.140 に答える