我在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
}
})
通过查看页面,我可以看到实际使用的模板是在结果块中应用更改之前的模板。
答案 0 :(得分:2)
使用返回对象的“ scope”属性通过属性传递数据。 这样,如果使用controllerAs语法,则可以使用'bindToController“属性。 好吧,我强烈建议您在指令替换中使用组件方法。
答案 1 :(得分:2)
link
函数是不适当的地方,因为它是在编译模板之后执行的,因此无法修改模板。而是使用template属性的函数形式
修改模板:
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;
}
}
})
有关更多信息,请参见AngularJS Comprehensive Directive API Reference - template。