迁移到 Angular 1.3 - 基于模型数据生成视图风格文本 - 最佳方法

Migrating to Angular 1.3 - Generating view Flavour Text based on model data - best approach?

本文关键字:视图 数据 风格 方法 最佳 文本 Angular 迁移 于模型 模型      更新时间:2023-09-26

Background

在角度 1.3 中,"你不能再在角度表达式中的函数上调用 .bind、.call 或 .apply。

在 angular 1.2 中,我在控制器/指令的作用域中使用方法来为混合集合中的对象生成文本/模板。

问题示例

例如,此示例控制器包含一个数组,其中包含不同(非统一(类型和结构的对象:

app.controller('flavourText', function ($scope) {
  $scope.exampleData = {
    data: [
      {dataType: 'a', message: 'Type A String'},
      {dataType: 'b', numbers: [1,2,3,]},
      {dataType: 'a', message: 'Another Type A String'},
      {dataType: 'b', numbers: [1,3,3,7]},
      {dataType: 'a', message: 'Last Type A String'}
    ]
  };
);

方法

我想出了两种生成风味文本/切换模板的方法:

方法 1:使用 ng-if

<!-- FIRST WAY OF DOING THINGS -->
<ul>
   <li ng-repeat="item in $scope.example.data">
     <span ng-if="item.dataType === 'a'">This is an example of type A: {{item.message}}     </span>
     <span ng-if="item.dataType === 'b'">This is an example of type B: {{item.numbers}}     </span>
   </li>
</ul>

这种方法在HTML中变得非常混乱/效率低下,所以我开始使用第二种方法。

方法 2:在表达式中使用函数

在控制器中:

 $scope.generateFlavourText = function (item){
    if (item.dataType === 'a') {
      return "This is an example of type A: " + item.message;
    } else if (item.dataType === 'b'){
      return "This is an example of type B: " + item.numbers;
    }
  };

在模板中:

<!-- FOLLOWING METHOD DOES NOT WORK IN ANGULAR 1.3 -->
<ul>
  <li ng-repeat="item in $scope.example.data">
    {{generateFlavourText(item)}}
  </li>
</ul>

问题

指令格式化程序/解析器

我应该为此使用指令和 ngModel 格式化程序/解析器吗?

有没有更好的方法?

我应该屈服并恢复到方法 1,它变得非常混乱和混乱(+ 除非使用绑定,否则价格昂贵(。

如果我理解正确,您有一个对象数组,并且您希望以不同的方式显示它们,具体取决于其属性给出的类型。我会为每种类型创建一个模板来分隔它们,因此它们既组织良好又易于阅读/增强。

<ul>
  <li ng-repeat="item in exampleData.data" 
      ng-include="'path/to/templates/' + item.dataType + '.html'">
  </li>
</ul>

答.html

This is an example of type A: {{item.message}}

乙.html

This is an example of type B: {{item.numbers}}

ng-include缓存视图,因此您不必担心效率。