0

这是我的场景。如果表单收到错误消息,我想刷新我的验证码。而且我有多个视图可以使用验证码。

所以我写了一个工厂:

Services.factory 'Captcha', ['$rootScope', ($rootScope) ->
  service = {}
  service.new_captcha = () ->
    console.log 'render cap'
    $rootScope.captcha_src = "/captcha?action=captcha&i=#{+new Date}"
  service
]

然后另一个处理 $http 进程的工厂将触发下面的代码

$http
.error (data) ->
  service.signin_err_msg = data.error
  Captcha.new_captcha()
  $rootScope.$broadcast('new_captcha')

在视图控制器中,$scope 值会监听广播并改变 src 值。

SignUpCtrl = App.controller 'SignUpCtrl', ($scope, UserService, $location, $rootScope) ->

  $scope.UserService = UserService

  $scope.$on 'new_captcha', (val) ->
    $scope.captcha_src = $rootScope.captcha_src

  $scope.captcha_src = $rootScope.captcha_src

这行得通。但我不认为这是一个好方法。我必须编写相同的代码来监听 rootScope 广播。有没有更好的相同方法?

4

2 回答 2

1

正如 rtcherry 所说,您不需要使用$rootScope. 请看看这个 Plunker:http ://embed.plnkr.co/4ppfCi/preview

于 2013-06-22T11:45:09.520 回答
0

无需使用$rootScope或广播任何事件。这也可以:

验证码服务

Services.factory('Captcha', [function() {
  var captchaSrc;
  return {
     get_captcha_src: function() {
       if (!captchaSrc) {
         this.refresh_captcha();
       }
       return captchaSrc;
     },
     refresh_captcha: function() {
       captchaSrc = "/captcha?action=captcha&i=" + new Date();
     }
  }
}]);

HTTP 处理程序

$http.error(function(data) {
  service.signin_err_msg = data.error;
  Captcha.refresh_captcha();
});

控制器

var SignUpCtrl = App.controller('SignUpCtrl', function($scope, $location, UserService, Captcha) {
  ...

  $scope.get_captcha_src = function() {
    return Captcha.get_captcha_src();
  }

  // or this: $scope.get_captcha_src = Captcha.get_captcha_src;

});
于 2013-06-22T11:20:32.887 回答