2015-11-19 48 views
4

我有一個工廠,我在其中將語言屬性設置爲字符串。現在,當用戶單擊我網站上的圖像時,我想更改此屬性(此處的想法是在單擊標誌時更改整個網頁網站)。到目前爲止,當我手動更改頁面語言時(使用ng-show),但在按下圖像時我無法改變它。使用ng-click來更改出廠值

我廠:

'use strict'; 

angular.module('langService', []) 
    .factory('Language', function() { 
     var myFactory = {}; 

     myFactory.language = 'slo'; 

     return myFactory; 
    }); 

我的控制器:

'use strict'; 

angular.module('ZICApp') 
    .controller('navbarController', function ($scope, Language) { 
     $scope.language = Language.language; 
    }); 

我的html:

<div id="navbar" ng-controller="navbarController"> 
    <ul> 
     <li><a ng-click="language = 'eng'"><img src="images/EN.gif"></a></li> 
    </ul> 
    </div> 

這需要改變的內容是視圖文件中,以及在模板。如果您需要關於該項目的其他信息,請告訴我,儘量儘量減少它。

+0

這對於plunkr來說有點太大了,請看這裏的git repo https://github.com/Shooshte/ZIC-dist –

回答

5

你的工廠需要像

 myFactory.setLanguage = function(lang) { 
      myFactory.language = lang; 
     }; 

的方法雖然你的控制器應實現諸如

 $scope.changeLanguage = function(lang) { 
      Language.setLanguage(lang); 
     } 

而且你的NG-點擊一個方法調用changeLanguage('eng')


所得廠:

'use strict'; 

angular.module('langService', []) 
    .factory('Language', function() { 
     var myFactory = {}; 

     myFactory.language = 'slo'; 
     myFactory.setLanguage = function(lang) { 
      myFactory.language = lang; 
     }; 

     return myFactory; 
}); 

所得控制器:

'use strict'; 

angular.module('ZICApp') 
    .controller('navbarController', function ($scope, Language) { 
     $scope.language = Language.language; 
     $scope.changeLanguage = function(lang) { 
      Language.setLanguage(lang); 
     } 
    }); 

產生的HTML:

<div id="navbar" ng-controller="navbarController"> 
    <ul> 
     <li><a ng-click="changeLanguage('eng')"><img src="images/EN.gif"></a></li> 
    </ul> 
</div> 

編輯 skubski是絕對正確的,變量應該私下舉行。要做到這一點,你可以改變工廠這樣的:「」

angular.module('langService', []) 
    .factory('Language', function() { 
     var language = 'slo'; 

     function setLanguage(lang) { 
      //...optional logic 
      language = lang; 
     } 

     function getLanguage() { 
      return language; 
     } 

     return { 
      setLanguage: setLanguage, 
      getLanguage: getLanguage 
     }; 
}); 

,並在控制器改變$scope.language = Language.language;$scope.language = Language.getLanguage();

+0

不需要封裝工廠方法,引用就足夠了。你的工廠也暴露了渲染setter方法的語言變量無用。 – skubski

+0

由於您可以處理getter中的錯誤(即'找不到語言')並執行其他一些邏輯(如清除緩存以便在用戶更改語言時更新視圖),那麼setter對我來說似乎非常有用。 –

+2

你做**沒有**吸氣劑。你** **變量** ** public **,這樣就可以在沒有setter的情況下進行操作,使它變得沒有用處。此外,在其他地方使用set方法時,您需要重寫錯誤處理。 – skubski

1

您應該使用點符號爲了使用對象及其屬性的引用而不是基本類型,如果你想直接訪問它們。

你應該試着改變你的工廠是這樣的:

<li><a ng-click="languageProvider.settings.currentLanguage = 'eng'"><img src="images/EN.gif"></a></li> 

使用此:

$scope.languageProvider = Language; 
在標記訪問對象的屬性參照

var myFactory = {}; 
var myFactory.settings = { 
    currentLanguage : 'slo' 
}; 
return myFactory; 
控制器

方法,如果你需要直接訪問服務對象,但建議提供getter/setter訪問服務數據的方法。

編輯 我會去像iWork建議的setter/getter aproach。