【问题标题】:Dynamically loading an external template in AngularJS在 AngularJS 中动态加载外部模板
【发布时间】:2015-02-16 17:32:20
【问题描述】:

我正在尝试在 AngularJS 中构建一个可编辑的表格组件。我希望它工作的方式是,当用户单击特定行上的编辑按钮时,该行将替换为包含绑定到模型的输入字段的“编辑模板”。你可以在这个Plunker看到我的进步。

我正在使用自定义指令来定义一个包含可编辑行的表格,如下所示:

<table ng-controller="peopleController as peopleCtrl">
  <tr editable-row edit-model="person" edit-tmpl="'person-editor.html'"  ng-repeat="person in peopleCtrl.people">
    <td>{{person.name}}</td>
    <td>{{person.age}}</td>
    <td>
      <button>Edit</button>
    </td>
  </tr>
</table>

在可编辑行指令的链接函数中,我将“编辑模板”创建为 html 字符串,并使用 $compile 将表达式绑定到指令范围。我想做的不是在 Link 函数中对 html 进行硬编码,而是从指令“edit-tmpl”属性引用的外部文件加载模板。注意:为指令设置 templateUrl 不起作用,因为我只希望在用户单击编辑按钮时将模板加载并注入到 DOM 中。

我的问题有两个:

1) 如何从我的指令的 Link 函数中的“edit-tmpl”属性引用的模板文件中加载 html?

2) 由于我是 Angular 新手,我想知道我的方法是否符合 AngularJS 的方式?从角度设计的角度来看,通过这样的属性在 HTML 中指定编辑模板,然后在指令的 Link 函数中加载是一个好主意,还是我缺少更好的方法?

【问题讨论】:

  • 如果你对角度方式感兴趣 - 你可以看看 bootstrap-ui 指令。它们所有的模板都存储在 $templateCache 中并由 id 引用,因此可以在外部替换它们。我不明白为什么你如此关心加载额外的模板 - 99% 的它不是你的应用程序的一个狭窄的地方。
  • 谢谢彼得。我将看一下 bootstrap-ui 指令。我想要在 Link 函数之外指定模板的基本原因是,该指令可以在不同的表中重用,并为每个表创建不同的编辑模板。我的一些表可能包含一些更复杂的 UI 来编辑行(不仅仅是简单的输入字段),所以我希望能够为每个表单独定义行编辑器,但无需每次都编写全新的指令。

标签: angularjs angularjs-directive


【解决方案1】:
app.directive('editableRow', function($compile){
  return{
    restrict:'A',
    replace:true,
    scope: {editModel: '='},


    link: function(scope, element, attr){
      element.find('button').on('click', function(){

            var htmlText = '<div ng-include="{{attr.editTmpl}}"></div>';

             OR

            var htmlText='<div ng-include src="{{attr.editTmpl}}"></div>';

            // I don't know which would work for you. but this is the way to add dynamic template to your directive by just passing appropriate path of template to attr.editTmpl attribute;

        var editTmpl = angular.element($compile(htmlText)(scope));
        element.replaceWith(editTmpl);
      });
    }
  };
});

但我只是想知道你的指令。在这里,您使用的是 replaceWith 方法(它将您的模板替换为现有的一行) 但是在连续编辑完成后,您将如何取回原始模板或 ROW?我想看看兄弟。

【讨论】:

  • 谢谢。我似乎无法让它工作。遇到第一个 { 时出现 javascript 错误。我尝试删除 {{}} 并改用字符串连接来生成正确的 ng-include 标记,但似乎仍然不起作用。 ng-include 被 HTML 中的注释替换,但不是模板代码:请参阅此处plnkr.co/edit/16TyvWy0lEla6iH56kue?p=preview 至于在编辑完成后恢复视图显示,我可能会使用 ng-show 并远离 replaceWith()最终设计。
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多