我想知道我是否做得对。
序言 我开发了一个Typeahead类,它消耗资源并将结果存储在自身中。该类或多或少具有以下结构:
问题是,如果我想将所有必需的属性附加到输入,代码看起来很臃肿:p>
<input
type="text"
ng-model="myTa.input"
ng-change="myTa.change();"
ng-keyup="myTa.cursor()"
....
/>
我想要完成的是一个只需要Typeahead实例的指令,它会自动将所有必需的属性附加到元素。例如:
<input type="text" my-typeahead="myTa" />
在继续之前,我想说清楚以下内容:
现在,如果我这样做,我会在地狱里燃烧:
angular
.module('myTypeaheadDirective', [])
.directive('myTypeahead', function($compile, $rootScope) {
return {
restrict: 'A',
scope: {
typeahead: '=myTypeahead'
},
compile: function() {
return {
pre: function precompile(scope, element, attrs) {
var installedAttribute = 'my-typeahead-installed';
if ( angular.isUndefined( element.attr( installedAttribute ) ) ) {
element.attr('ng-model', 'typeahead.input');
element.attr('ng-change', 'typeahead.change()');
element.attr( installedAttribute, true );
$compile(element)(scope.$parent);
}
}
}
}
}
});
解释代码:
指令预编译过程检查它是否已经安装,否则它将进入无限循环。
在条件中我添加了尽可能多的指令。
请注意,我正在使用ng-model =“typeahead.input”,但这是一个独立的范围,因此我可以使用不同的typeahead实例进行多个输入。
在附加新指令之后,我使用$ compile服务使用父作用域重新编译元素(因此它可以访问原始的typeahead实例)。
我的问题是:
非常感谢您抽出宝贵的时间:)
答案 0 :(得分:0)
由于您传递到隔离范围的内容可以很容易地从属性值中使用...可以删除隔离范围,然后指令范围将是父级的范围。
要从属性设置typeahead对象,只能执行以下操作:
var typeahead= attrs.myTypeahead;
element.attr('ng-model', typeahead+'.input');