4

John Papa のAngularJS Style Guideに記載されているガイドラインを適用しようとしています。

私たちが従い始めたルールの 1 つがDefer Controller Logicです。

サービスとファクトリに委譲することにより、コントローラーのロジックを延期します。

なぜ ?: ロジックは、サービス内に配置され、関数を介して公開されると、複数のコントローラーによって再利用される場合があります。

なぜ ?: サービスのロジックは単体テストで簡単に分離できますが、コントローラーの呼び出しロジックは簡単にモックできます。

なぜ ?: 依存関係を削除し、コントローラーから実装の詳細を非表示にします。

これは、データ取得ロジックをサービスに分離するのではなく、コントローラーに配置することで過去に違反したことです。

今は、ルールをできるだけ厳しくしたいと思っています。理想的には、構成されたサービスの 1 つが依存関係としてコントローラーに渡された場合に、angular がエラーをスローするようにしたいと考えています。角度レベルで解決できるものですか、それとも個別に解決する必要がありますか? たとえば、カスタムESlintルールを使用して静的に解決しますか?

洞察やヒントをいただければ幸いです。


$http特に、次のコントローラーはサービスを直接使用するため、ルールに違反しています。

function OrderController($http, $q, config, userInfo) {
    var vm = this;
    vm.checkCredit = checkCredit;
    vm.isCreditOk;

    function checkCredit() {
        var settings = {};

        return $http.get(settings)
            .then(function(data) {
               vm.isCreditOk = vm.total <= maxRemainingAmount;
            })
            .catch(function(error) {

            });
    };
}

また、コードの品質について過度に心配している/夢中になっている場合はお知らせください:)

4

2 に答える 2

2

私は一種の回避策を書きましたが、非常にトリッキーで汚いので、決して使用してはなりません:

<!doctype html>
<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.3/angular.js"></script>
    </head>
    <body ng-app="plunker" ng-controller="MainCtrl">
        <div ng-repeat="violation in codestyleViolations">
            {{violation}}
        </div>
    </body>
    <script>
    var app = angular.module('plunker', []).config(function($controllerProvider) { 
        $controllerProvider.$get[0] = 'trickyInjector';
    }).factory('trickyInjector', ['$injector', '$rootScope', function($injector, $rootScope) {
        $rootScope.codestyleViolations = [];
        var originalFunc = $injector.invoke;
        $injector.invoke = function(fn, self, locals, serviceName) {
            if (locals && locals.$scope && fn.indexOf('$http') !== -1) {
                $rootScope.codestyleViolations.push('ALYARM! ' + serviceName + ' uses $http');
            }
            return originalFunc.apply(this, arguments);
        };
        return $injector;
    }]).controller('MainCtrl', ['$scope', '$http', function($scope, $http) {

    }]);
    </script>
</html>

于 2015-01-06T21:55:56.260 に答える