2014-10-31 90 views
0

我有一個模塊App和工廠i18n,什麼叫i18n.load 方法的形式應用的最佳方式(配置?跑?等?)如何從模塊設置中調用角度工廠方法?

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"); } 
    } 
    } 
); 
+0

你不能從配置中加載它,所以使用'.run'部分。 – dfsq 2014-10-31 14:41:14

回答

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請求或您正在使用的任何服務的正確承諾。

對使用​​這種方式的好處是,你可以有不同的標籤,爲您的國際化不同的頁面,並使用國際化的服務,以恢復它們無論你身在何處。

+0

謝謝,非常有用的答案 – euvl 2014-10-31 15:49:49

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(); 
    }); 
+0

我有用文件分隔的代碼。你對角度的「模塊定義」的理解與現實完全不同,再加上我不需要控制器。仍然感謝努力 – euvl 2014-10-31 15:52:04

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')} 
     }; 
    }); 
); 

你被要求尚未確定(據我可以告訴)的模塊。你添加的工廠是'App'模塊,而不是'service.i18ndb'。

然後,您需要依賴項中的run方法從那裏把它注入i18ndb工廠(假設你要調用該函數來引導你的應用程序)。