如何根据属性值修改AngularJs指令模板?

如何根据属性值修改AngularJs指令模板?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我有一个建立在Angular Bootstrap typeahead之上的下拉指令 我希望指令的使用者能够提供一个属性(限制为列表),该属性确定用户输入是否限制为列表成员。在uib typeahead指令中,这是通过将typeahead可编辑属性设置为“true”或“false”来实现的 因为我的指令封装了生成下拉列表的uib,所以我需要更改指令的模板以相应地更改其行为,但我不知道如何才能做到这一点。我试图在我的指令的return子句中修改字符串模板,但这不起作用,我想是因为模板的值是在处理re

我有一个建立在Angular Bootstrap typeahead之上的下拉指令

我希望指令的使用者能够提供一个属性(限制为列表),该属性确定用户输入是否限制为列表成员。在uib typeahead指令中,这是通过将typeahead可编辑属性设置为“true”或“false”来实现的

因为我的指令封装了生成下拉列表的uib,所以我需要更改指令的模板以相应地更改其行为,但我不知道如何才能做到这一点。我试图在我的指令的return子句中修改字符串模板,但这不起作用,我想是因为模板的值是在处理return函数之前读取的吧

以下是指令:

angular.module("app").directive("dropDown",  function () {
  var mt=mydropdowntemplate;

  return {
    link: function (scope, element, attrs) {
        var limitToList = attrs["limit-to-list"]=="false"; 
        var editable = !limitToList;
        if (editable) {
            mt=mt.replace("typeahead-editable='false'","typeahead-editiable='true'");
        }
        console.log("template: "  + mt )
        var list = scope[attrs["list"]];
        var length=list.length
        var valueName = attrs["value"];
        var idName = attrs["key"];       
    },
    template: mt  //This has the value of mt prior to the replace function above    
  }
})
通过查看页面,我可以看到实际使用的模板是在结果块中应用更改之前使用的模板


使用返回对象的“scope”属性通过属性传递数据。 与此类似,如果使用controllerAs语法,则可以使用“bindToController”属性。
我强烈建议在replace to指令中使用组件方法。

在编译模板后执行模板时,
链接
函数不适合修改模板。请改用模板属性的函数形式 要修改模板,请执行以下操作:

angular.module("app").directive("dropDown",  function () {
  var mt=mydropdowntemplate;

  return {
    link: function (scope, element, attrs) {
        var list = scope.$eval(attrs.list);
        var length=list.length
        var valueName = attr.value;
        var idName = attrs.key;       
    },
    template: function (tElem, tAttrs) {
         var limitToList = tAttrs.limitToList=="false"; 
         var editable = !limitToList;
         if (editable) {
             mt=mt.replace("typeahead-editable='false'","typeahead-editiable='true'");
         }
        console.log("template: "  + mt )
        return mt;
    } 
  }
})
有关详细信息,请参阅