web-dev-qa-db-ja.com

AngularJsのサービスに引数を渡す

私は、AngularJの最初の一口を簡単なものに設定しようとしていますが、残念ながら、かなりの時間をかけてうまくいきませんでした。

私の前提:
ユーザーはドロップダウンからオプションの1つを選択し、選択の下のdivに適切なテンプレートをロードします。サービス、カスタムディレクティブ(@Josh David Millerのansをこの post で追跡することにより)と適切なコントローラーを設定しました。サービスでのajax呼び出しは、パラメーターがサーバーに渡すとハードコードされます。これを、ユーザーが選択したドロップダウンの「キー」にしたいのですが、現時点では、このコードをサービスに渡せません。

私の構成:

    var firstModule = angular.module('myNgApp', []);

    // service that will request a server for a template
    firstModule.factory( 'katTplLoadingService', function ($http) {

        return function() {


            $http.get("${createLink(controller:'kats', action:'loadBreedInfo')}", {params:{'b1'}}
            ).success(function(template, status, headers, config){
                return template

            })
        };
    });


    firstModule.controller('KatController', function($scope, katTplLoadingService) {
        $scope.breed = {code:''}

        // here I am unsuccessfully trying to set the user selected code to a var in service, 

        //var objService = new katTplLoadingService();
        //objService.breedCode({code: $scope.breed.code});


        $scope.loadBreedData = function(){
            $scope.template = katTplLoadingService();
        }
    });



    firstModule.directive('showBreed', function ($compile) {
        return {
            scope: true,
            link: function (scope, element, attrs) {
                var el;
                attrs.$observe( 'template', function (tpl) {

                    if (angular.isDefined(tpl)) {

                        el = $compile(tpl)(scope);
                        element.html("");
                        element.append(el);
                    }
                });
            }
        };
    })

そしてHTML設定は

<form ng-controller="KatController">

   <select name="catBreeds" from="${breedList}" ng-change="loadBreedData()"
         ng-model="breed.code" />

   <div>

      <div show-breed template="{{template}}"></div>

   </div>

</form>

$ scope.breed.codeの値にするには、$ http ajax呼び出しで現在ハードコーディングされている値「b1」が必要です。

14
rstarter

Ajaxリクエストは非同期ですが、コントローラーはリクエストが同期されているかのように動作します。

Getリクエストには、正しく実行するために必要なものがすべて含まれていると思います。

最初にコールバックをサービスに渡します(fnの使用方法に注意してください):

firstModule.factory( 'katTplLoadingService', function ($http) {
    return { 
        fn: function(code, callback) { //note the callback argument
            $http.get("${createLink(controller:'kats', action:'loadBreedInfo')}",
            params:{code: code}}) //place your code argument here
                .success(function (template, status, headers, config) {
                    callback(template); //pass the result to your callback
                });
        };
    };
});

コントローラで:

$scope.loadBreedData = function() {
    katTplLoadingService.fn($scope.breed.code, function(tmpl) { //note the tmpl argument
        $scope.template = tmpl;
    });
}

そうすることで、コードは非同期取得リクエストを処理します。

私はそれをテストしませんでした、しかしそれは仕事をしているに違いありません。

18
roland

factoryを正しく定義していないと思います。これを試してください:

firstModule.factory('katTplLoadingService', ['$resource', '$q', function ($resource, $q) {
    var factory = {
        query: function (selectedSubject) {
            $http.get("${createLink(controller:'kats', action:'loadBreedInfo')}", {
                params: {
                    'b1'
                }
            }).success(function (template, status, headers, config) {
                return template;
            })
        }
    }
    return factory;
}]);


firstModule.controller('KatController', function($scope, katTplLoadingService) {

    $scope.breed = {code:''}    

    $scope.loadBreedData = function(){
        $scope.template = katTplLoadingService.query({code: $scope.breed.code});
    }
});
0
Maxim Shoustin