【问题标题】:translate only the first option of the select只翻译选择的第一个选项
【发布时间】:2015-05-27 02:13:48
【问题描述】:

我正在使用 AngularJS 构建一个应用程序。

该应用程序是多语言的。您可以从下拉列表中更改语言(选择 HTML 元素)。

我有以下选择:

<select id="filter" class="form-control" ng-model="filter" ng-change="ref()" ng-options="rt.text | translate for rt in rts track by rt.value">
</select>

您可能会看到text 应用了一个过滤器,即translate。这是 Angular Translate 模块的一部分。

我的下拉列表是从数据库中动态填充的,它有一个额外的选项,这是默认选项。

我想要的是在语言发生变化时翻译默认选项,我不知道该怎么做。

当前解决方案的问题是,如果它有任何其他多语言翻译选项,它们将被翻译。我不想要这个,我只想翻译默认选项。

当我添加默认选项时,我使用value='all'text='Show all' 将其设置为index=0

rts的结构:

[
 {
  value:'all',
  text: 'Select_all'
 },
 {
  value:'1',
  text: 'option 1'
 },
 {
  value:'2',
  text: 'Option 2'
 }
]

【问题讨论】:

  • 当您获得选项时,为什么不在控制器中进行翻译,而不是作为过滤器进行翻译?
  • 我不能这样做,因为我在另一个控制器中管理语言。因此,当我更改当前控制器中的语言时,我看不到翻译值的方法..
  • rts 来自哪里?你能举个例子说明你是如何将选项加入这个指令的吗?
  • 我为rts添加了JSON结构。

标签: angularjs angular-translate


【解决方案1】:

为什么不只翻译来自服务器的那个选项呢?我假设您的控制器如下所示。此外,您还需要收听$translateChangeSuccess,以便了解语言何时发生变化:

module.controller('RtsCtrl', function ($rootScope, $scope, $translate, rtsService) {
    var translateDefaultOption = function (options) {
        options[0].text = $translate(options[0].text);
        $scope.rts = options;
    };

    var getTranslatedOptions = function () {
        rtsService
                .getOptions()/*<- Might want to cache this or not*/
                .then(translateDefaultOption);
    };

    getTranslatedOptions();

    var cleanUpOnDestroy = $rootScope.$on('$translateChangeSuccess', getTranslatedOptions);
    $scope.on('$destroy', cleanUpOnDestroy);
});

显然我不知道你的控制器是如何工作的,所以这只是一个粗略的例子。

【讨论】:

  • 如果我使用这个解决方案,当我从下拉菜单中更改语言时,它不会翻译该选项。
  • @tzortzik translate 过滤器是您创建的还是来自 angular-translate 的过滤器?设置语言的控制器与处理此option 指令的控制器有何关系?
  • 来自angular-translateMyController 此刻对 LanguageController 一无所知。该应用程序的所有翻译均使用 {{'text'"translate}} 完成。
  • @tzortzik 查看我的更新,您需要收听$translateChangeSuccess
【解决方案2】:

编辑:不幸的是,根据 ngOptions 文档,这仅在选项值为空时有效

ng-options 中删除默认选项,例如使用rts.slice(1)

&lt;select&gt; 中使用&lt;option&gt; 标签添加它。

<select ... ng-options="...">
     <option value="">
        {{ rts[0].text | translate }}
     </option>
</select>

那么你只翻译默认选项就没有问题了。

【讨论】:

  • 你能给我一个更详细的例子吗?如何使用 Angular 将选项添加为选择的第一个元素?
  • 我喜欢这个解决方案!虽然我仍然不确定当语言改变时它是否会起作用,因为没有手表绑定到 translateLanguage。
  • @EstebanFelix 我可能更喜欢你自己的解决方案。只是想将此添加为另一种选择。
  • 我尝试了您的示例,但由于ng-options,它无法正常工作。当你更改数组时,它会自动替换select中的所有选项,甚至是默认选项。所以在我的情况下它永远不会出现。
  • @tzortzik 好吧,你是对的。您可以添加一个option,但它需要有一个空值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 2011-07-29
  • 2016-12-12
  • 1970-01-01
相关资源
最近更新 更多