如何从模块设置中调用角度工厂方法?

时间:2014-10-31 14:36:29

标签: javascript angularjs

我有一个模块App和工厂i18n,调用i18n.load的最佳方式是什么  方法表单App(config?run?etc?)

angular
  .module('App', [
    'ngRoute',
    'service.i18ndb'
  ])
  .config(function ($routeProvider) {

    //want to i18n.load() here somehow

    $routeProvider
      .when('/signin', {
        templateUrl: '../views/sign-in.html',
        controller: 'SigninCtrl'
      })
      .when('/mix', {
        templateUrl: '../views/mix.html',
        controller: 'MixCreateCtrl'
      })
      .otherwise({
        redirectTo: '/signin'
      });
  });


angular.module('App')
  .factory('service.i18ndb', function() {
    return {
      load: function() { console.log("Busy"); }
    }
  }
);

3 个答案:

答案 0 :(得分:1)

如果使用.run,您将始终遇到的问题是必须处理没有加载i18n的页面。这意味着当他们没有加载i18n时,你需要有办法处理你的视图。您可以隐藏它,或者文本将首先使用错误的值闪烁。

然而,AngularJS为您提供了一个很棒的功能,以确保在加载视图之前加载它:解析器!

以下是如何做到的。

var i18nResolver = function(service.i18ndb) {
  return service.i18ndb.promise;
};

$routeProvider
  .when('/signin' {
    templateUrl: '../views/sign-in.html',
    controller: 'SigninCtrl',
    resolve: {
      i18n: i18nResolver
    }
  });

您可以修复此代码,以使用您的HTTP请求或您正在使用的任何服务的正确承诺。

使用这种方式的一个好处是,您可以为i18n的不同页面使用不同的标签,并使用i18n服务来恢复它们,无论您身在何处。

答案 1 :(得分:0)

您正在定义您的应用模块两次。一个你创建工厂,它可以注入控制器并在那里使用。你可以尝试这样的事情:

  angular.module('App', ['ngRoute','service.i18ndb'])
  .factory('service.i18ndb', function() {
    return {
      load: function() { console.log("Busy"); }
    }
  })
  .config(function ($routeProvider) {

    //want to i18n.load() here somehow

    $routeProvider
      .when('/signin', {
        templateUrl: '../views/sign-in.html',
        controller: 'SigninCtrl'
      })
      .when('/mix', {
        templateUrl: '../views/mix.html',
        controller: 'MixCreateCtrl'
      })
      .otherwise({
        redirectTo: '/signin'
      });
  })
  .controller('SigninCtrl', function($scope, service.i18ndb) {
      // Call your factory function here
      service.i18ndb.load();
      // If the function returns a value you could assign it to a scope
      // variable so it can be used in your template 'sign-in.html'
      $scope.your_variable = service.i18ndb.load();
  });

答案 2 :(得分:0)

angular
  .module('App', [
    'ngRoute'
  ])
  .config(function ($routeProvider) {

    //want to i18n.load() here somehow

    $routeProvider
      .when('/signin', {
        templateUrl: '../views/sign-in.html',
        controller: 'SigninCtrl'
      })
      .when('/mix', {
        templateUrl: '../views/mix.html',
        controller: 'MixCreateCtrl'
      })
      .otherwise({
        redirectTo: '/signin'
      });
  })
    .run(['i18ndb', function(i18ndb) {
      i18ndb.load();
    }])

    .factory('i18ndb', function() {
      return {
        load : function() {console.log('test')}
      };
    });
);

你需要一个尚未定义的模块(据我所知)。你要添加的工厂是在应用程序上。模块不是' service.i18ndb'。

然后你需要依赖注入i18ndb工厂到run方法来从那里调用它(假设你想调用该函数来引导你的应用程序)。