angular-vfremote コードリード(2)

イシュー

  • angular-vfremote のfactory部分のコードリード

参考

            // Create angular factory that defines service to call apex.
            myModule.
                factory('doubleMe', ['$q', '$rootScope', function($q, $rootScope) {

                    return function(inputString) {
                        var deferred = $q.defer();

                        Visualforce.remoting.Manager.invokeAction(
                            '{!$RemoteAction.angular_vfremote_Ctrlr.valueDoubler}',
                            inputString, 
                            function(result, event) {
                                $rootScope.$apply(function() {
                                  if (event.status) {
                                    deferred.resolve(result);
                                  } else {
                                    deferred.reject(event);
                                  }
                                })
                            },
                            { buffer: true, escape: true, timeout: 30000 }
                        );

                        return deferred.promise;
                    }

                }]);

myModule はどこで定義?

  • name空間='angvfr' のmyModule は、js/app.js
var myModule = angular.module('angvfr', ['angvfr.controllers',
                                         'angvfr.directives',
                                         'angvfr.filters',
                                         'angvfr.services']);

factory は何やるのか?

  • factory(name, $getFn);
  • サービスのインスタンスを返す。
    • ここでは、doubleMeというサービスを登録している
  • $getFn は、functionであるべきはずが、配列[第一引数?, 第二引数?, function]になっている。
    • これはangular独自の書き方??

参考

doubleMe サービス(関数)はどこで使われる?

  • js/controllers.js
var myModule = angular.module('angvfr.controllers', []);

myModule
  .controller('MyCtrl1', ['$scope', 'doubleMe', function($scope, doubleMe) {

    $scope.sfdcResult = '_____';

    doubleMe(10).then(function(result) {$scope.example1 = result;})
    doubleMe('ten').then(function(result) {$scope.example2 = result;})

    $scope.askSFDC = function(input){
        doubleMe(input).then(function(result) {$scope.sfdcResult = result;},
                           function(error)  {$scope.sfdcResult = 'ERROR: ' + error.message;}
                                      )
    };
 

    
  }])

  .controller('MyCtrl2', [function() {

  }]);

doubleMe 関数の第一引数の $q は何?

  • $q の defer というメソッドから、 deferred を作成している。

参考