我有许多角度为1.5的组件,它们都采用相同的属性和数据结构。我认为它们可以重新计算到单个组件中,但我需要一种基于type
属性的插值来动态选择模板的方法。
var myComponentDef = {
bindings: {
type: '<'
},
templateUrl: // This should be dynamic based on interpolated type value
};
angular.module('myModule').component('myComponent', myComponentDef);
我无法使用templateUrl function($element, $attrs) {}
,因为$attrs
中的值未被插入,因此我无法获取传入数据中指定的类型。
我可以拥有一个包含一系列ng-if
或ng-switch
指令的大模板,但我希望将这些模板分开。
或者,我可以将组件分开并在父组件中使用ng-switch
等,但我不喜欢这样,因为它似乎有很多重复。
我正在寻找一个解决方案,我可以使用插入到绑定中的插值type
来匹配每个类型的模板网址,然后将用于构建组件。
这可能吗?
由于
答案 0 :(得分:18)
这不是专门为其制作的组件。该任务缩小为使用带有动态模板的指令。现有的是var myComponentDef = {
bindings: {
type: '<'
},
template: '<div ng-include="$ctrl.templateUrl">',
controller: function () {
this.$onChanges = (changes) => {
if (changes.type && this.type) {
this.templateUrl = this.type + '.html';
}
}
}
}
。
要在组件中使用它,它应该是:
{{1}}
答案 1 :(得分:12)
您可以注入任何服务并设置动态网址
angular.module('myApp').component("dynamicTempate", {
controller: yourController,
templateUrl: ['$routeParams', function (routeParams) {
return 'app/' + routeParams["yourParam"] + ".html";
}],
bindings: {
},
require: {
}
});
答案 2 :(得分:0)
在任何情况下,您都必须在某处使用切换逻辑,那么为什么不将它简单地放在父组件模板中呢?
在这种情况下,拥有干净且易于理解的AngularJS模板比IMO更有价值:
<ng-container ng-switch="$ctrl.myComponentDef.type">
<component-type1 ng-switch-when="type1" param="$ctrl.myComponentDef"></component-type1>
<component-type2 ng-switch-when="type2" param="$ctrl.myComponentDef"></component-type2>
</ng-container>
即使您动态更改myComponentDef.type,交换机中的组件也会正确调用各自的$onDestroy
和$onInit
方法,并按预期加载数据 - 没有魔法,没有伏都教。< / p>