【问题标题】:AngularJS create partial template with parameterAngularJS 使用参数创建部分模板
【发布时间】:2017-10-07 09:53:12
【问题描述】:

我已经通过以下SO 问题得到我想要的。

create a single html view for multiple partial views in angularjs

Partial views in AngularJS

AngularJs Include Partial Template

angularjs partial template with specific scope - 看起来很接近我想要的。

但我相信我的情况与所有人都不同。因此,问题。

我有这个HTML 结构,需要重复很多次。

<tr>
    <td>
        Enitity1
    </td>
    <td>
        <input type="radio" name="entity1" value="option1" />
    </td>
    <td>
        <input type="radio" name="entity1" value="option2" />
    </td>
    <td>
        <input type="radio" name="entity1" value="option3" />
    </td>
    <td>
        <input type="radio" name="entity1" value="option4" />
    </td>
    <td>
        <input type="radio" name="entity1" value="option5" />
    </td>
</tr>

我想将实体的名称作为参数传递,并根据该参数呈现此 HTML 模板。

我已经创建了一个类似下面的模板。

<tr>
    <td>
        {{entity}}
    </td>
    <td>
        <input type="radio" name="{{entity}}" value="option1" />
    </td>
    <td>
        <input type="radio" name="{{entity}}" value="option2" />
    </td>
    <td>
        <input type="radio" name="{{entity}}" value="option3" />
    </td>
    <td>
        <input type="radio" name="{{entity}}" value="option4" />
    </td>
    <td>
        <input type="radio" name="{{entity}}" value="option5" />
    </td>
</tr>

我的控制器

app.controller("entitiesController", ["$scope",
    function entitiesController($scope) {
        $scope.init = function init(entity) {
            $scope.entity= entity;
        };
    }
]); 

我正在尝试在 &lt;tbody&gt; 元素中为多个实体呈现相同的内容,如下所示。

<ng-include src="Common/entities.html" ng-controller="entitiesController" ng-init="init('Entity1')"></ng-include>
<ng-include src="Common/entities.html" ng-controller="entitiesController" ng-init="init('Entity2')"></ng-include>
<!-- Some more entities here...-->

但它不起作用。它也不会在控制台中引发任何错误。

我该怎么做?处理这个的正确方法是什么?是否可以使用模板来处理它,还是我应该手动为所有实体放置 HTML?

【问题讨论】:

  • 你不能为此需要创建一个指令吗?
  • @tanmay 好吧,我对 AngularJS 比较陌生。您能否简要介绍一下指令在这种情况下如何工作?
  • 我的意思是我最近创建了一些基本指令,但不是发出或插入任何 HTML 模板。

标签: javascript html angularjs angularjs-templates


【解决方案1】:

您可以通过directive 为您执行此操作。类似的,

myApp.directive("myEntity", function() {
  return {
    restrict: "E",
    scope: {
      entity: "="
    },
    templateUrl: "Common/entities.html"
  }
})

现在,您可以使用您在Common/entities.html 中创建的模板,即,

<tr>
    <td>
        {{entity}}
    </td>
    <td>
        <input type="radio" name="{{entity}}" value="option1" />
    </td>
    <td>
        <input type="radio" name="{{entity}}" value="option2" />
    </td>
    <td>
        <input type="radio" name="{{entity}}" value="option3" />
    </td>
    <td>
        <input type="radio" name="{{entity}}" value="option4" />
    </td>
    <td>
        <input type="radio" name="{{entity}}" value="option5" />
    </td>
</tr>

最后,像&lt;my-entity entity="entityObj"&gt;&lt;/my-entity&gt; 一样使用它,其中entityObj$scope 中的一个变量(或者相应地,如果你使用controllerAs 语法)

EDIT:另一种方法是将指令作为属性而不是元素。

myApp.directive("myEntity", function() {
  return {
    restrict: "A",
    ...
  }
})

然后,从模板中删除 &lt;tr&gt;。现在,我们可以像这样使用它,

<tbody>
  <tr my-entity entity="entityObj">
  </tr>
</tbody>

【讨论】:

  • 感谢您的快速回复,我试试看!
  • 奇怪,它起作用了。但是,它只发出模板中有表达式的部分。这也不在其父元素内部,而是在其他地方。有什么想法吗?
  • 它只获取input 元素,而不是&lt;td&gt;s。另外,我将此指令放在&lt;tbody&gt; 标记中,例如&lt;tbody&gt;&lt;my-entities entity="entityObj"&gt;&lt;/my-entity&gt;&lt;/tbody&gt;。但它呈现在我页面上的其他位置,而不是 &lt;tbody&gt; 元素中。
  • 是的,现在渲染问题已经解决了。它正在渲染它应该在的地方。但它没有设置 {{}} 表达式中的值。我这样使用它:&lt;tr my-entity entity="Entity1"&gt;&lt;/tr&gt;。但它不会用参数Entity1 替换表达式中的值,而是用空格替换它。
  • 可能是因为我将它作为文本变量传递,而不是作为 scope 对象传递。这可能是问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多