我正在尝试在 AngularJS 中创建一个可重用的 typehead 指令,但我在路上遇到了一些障碍。这是我的工作示例:
指令.js
app.directive('autosuggest', function() {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
/* Nothing here yet */
}
};
});
app.directive('suggestinput', function() {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
// Bind keys
elem.bind('keydown', function (e) {
if (e.keyCode == 38 || e.keyCode == 40 || e.keyCode == 13) { scope.$emit('listNavigate', { code: e.keyCode }); }
else {
// Get suggestions
scope.getSuggest(attrs.source, elem.val());
}
});
// Listen for suggestion list
scope.$on('listSelect', function (e, data) {
elem.val(data.name);
});
}
};
});
app.directive('suggestlist', function() {
var selectedIndex = -1;
return {
restrict: 'A',
link: function (scope, elem, attrs) {
scope.$on('listNavigate', function (e, data) {
if (data.code === 38) {
selectedIndex--;
// User pressed up arrow
elem.children().removeClass('sel');
elem.children().eq(selectedIndex).addClass('sel');
} else if(data.code == 40) {
selectedIndex++;
// User pressed down arrow
elem.children().removeClass('sel');
elem.children().eq(selectedIndex).addClass('sel');
} else if(data.code == 13) {
// Prepare data
var selectData = {};
selectData.suggestValue = elem.children().eq(selectedIndex).children().html();
selectData.suggestId = elem.children().eq(selectedIndex).children().attr('item-id');
// Send data to input(s)
scope.$emit('listSelect', selectData);
}
});
}
};
});
html:
<fieldset autosuggest>
<input type="hidden" name="languageId">
<input type="text" suggestinput source="languages">
<input type="submit" class="button" value="Save">
<ul suggestlist ng-show="suggest.languages" class="suggestList">
<li ng-repeat="language in suggest.languages">
<a href="#" ng-bind="language.name" item-id="{{language.id}}"></a>
</li>
</ul>
</fieldset>
我有两个问题:
- 如何将项目 ID 从建议列表传递到隐藏输入?
- 如何使其成为可重用的组件?(即使我在同一页面上有多个打字头也能正常工作)
谢谢!