【问题标题】:How to evaluate attributes inside an angular directive如何评估角度指令中的属性
【发布时间】:2017-05-09 22:20:55
【问题描述】:

我的问题

我正在开发一个显示用户对象数据的角度组件。相应的模板如下所示并按预期工作:

<div>
  <h1>Information on user {{$ctrl.user.name}}</h1>

  <p><a href="#!/users/">Back to user list</a></p>

  <dl>
    <dt>Name:</dt><dd>{{$ctrl.user.name}}</dd>
    <dt>Native language:</dt><dd>{{$ctrl.user.nativeLanguage}}</dd>
    <dt>Preferred language:</dt><dd>{{$ctrl.user.preferredLanguage}}"></dd>
  </dl>
</div>

这会产生预期的输出:

关于用户 Thomas 的信息 返回用户列表 姓名:托马斯 母语:de 首选语言:en

两种语言的可能值是两个字符的 iso 代码或特殊值 '??'代表“未选择”,“--”代表“其他”。

我现在想创建一个角度指令来在语言文本旁边显示相应标志的图像。

我试过了:

angular.
module('flag').
controller('FlagController', ['$scope',
    function FlagController($scope) {
    }
  ]).
directive('flag',
  function() {
    return {
      restrict: 'E',
      scope: {
         lang: '@'
      },
      templateUrl: 'flag-template.html'
    };
  }
);

使用此指令模板:

<span>{{lang}}</span><img ng-src="img/{{lang}}.png" />

以及修改后的组件模板:

对于 Thomas,这会产生预期的输出:

关于用户 Thomas 的信息 返回用户列表 姓名:托马斯 母语:de(德国国旗) 首选语言:en(英国国旗)

但是,对于拥有两个特殊语言值的 James,输出看起来是这样的(因为没有图像文件“img/--.png”和“img/??.png”:

用户 James 的信息 返回用户列表 姓名:詹姆斯 母语: ?? (损坏的图像) 首选语言:--(损坏的图像)

所以我尝试根据语言值提供两个不同的指令模板。我将指令模板拆分为两个文件:

flag.template.flags.html

<span>{{lang}}</span><img ng-src="img/{{lang}}.png" />

flag.template.no-flags.html

<span>{{lang}}</span>

然后修改我的指令如下:

angular.
module('flag').
controller('FlagController', ['$scope',
  function FlagController($scope) {
    var self = this;
    console.log("FlagController, scope=", $scope);
  }
]).
directive('flag',
  function() {
    return {
      restrict: 'E',
      scope: {
        lang: '@'
      },
      templateUrl: function getTemplate(elements, attributes) {
        console.log("- lang=", attributes.lang);
        
        if (attributes.lang) {
          if ('??' === attributes.lang || '--' === attributes.lang) {
            return 'flag/flag.template.no-flags.html'
          } else {
            return 'flag/flag.template.flags.html'
          }
        }
        return 'flag/flag.template.no-flags.html'
      }
    };
  }
);

但是,这不起作用,因为 attributes.lang 不包含评估值(即 'de'、'en' 或 '??')但始终包含 '{{$ctrl.user.nativeLanguage}}' 或'{{$ctrl.user.preferredLanguage}}',因此总是返回'flag.template.flags.html'。

我的问题

有什么方法可以在 getTemplate() 函数中评估 attributes.lang 的值,或者确保在传递给指令的“lang”属性之前评估该值?

【问题讨论】:

  • 无关:不要使用语言标志。国旗代表国家,而不是语言。多个国家使用多种语言。许多国家/地区有多种官方语言。

标签: angularjs angularjs-directive


【解决方案1】:

只使用一个模板:

<span>{{lang}}</span>
<img ng-if="lang !== '--' && lang !== '??'" ng-src="img/{{lang}}.png" />

【讨论】:

  • 我想补充一点,会话期间语言可能不会改变。因此,您可能希望使用一次性绑定来提高性能:&lt;span&gt;{{::lang}}&lt;/span&gt;&lt;img ng-if="::(lang !== '--' &amp;&amp; lang !== '??')" ng-src="img/{{::lang}}.png" /&gt;
猜你喜欢
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2017-09-27
  • 2016-12-29
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多