Я сделал раскрывающийся список автозаполнения, используя угловую пользовательскую директиву. Все работает нормально. Но я хочу сделать эту директиву повторно используемой !!!!
В настоящее время моя директива сильно зависит от свойств Id и Name выбранного элемента.
Я хочу назначить текстовое свойство (которое я хочу связать текст с элементами списка html) и значение value (которое будет доступно в моем контроллере приложений), например textfield = "Name" и value-field = "Id".
Представьте, что если мой объект данных не содержит свойства Name или Id, моя директива не будет работать.
HTML:
<autofill-dropdown items="searchCurrencies"
textfield="Name" valuefield="Id" selected-data="Id" urllink="/api/SetupCurrency/Autofill?filter=">
</autofill-dropdown>
Шаблон:
<div class="pos_Rel">
<input placeholder="Search Currency e.g. doller,pound,rupee"
type="text" ng-change="SearchTextChange()" ng-model="searchtext"
class="form-control width_full" />
<ul class="currencySearchList" ng-show="IsFocused && items.length">
<li class="autofill" ng-repeat="item in items" ng-click="autoFill(item)">
{{item.Name}}
</li>
</ul>
</div>
Итак, наконец, что я хочу выполнить, я собираюсь связать свойство Name (или другое, зависит от того, какое значение я присвоил атрибуту "text-field" на мой html), в listitems и всякий раз, когда пользователь выбирает элемент, он будет давать мне выбранный Id (или другое свойство, зависит от того, какое значение я присвоил атрибуту value-field на моем html).
Обновить:
Я думаю, что мой вопрос не так ясен. Я написал одну и ту же директиву 2 раза, чтобы выполнить, а также 2 раза такой же шаблон :( Пожалуйста, просмотрите мой обновленный plunkr.
Я хочу сказать, что я не уверен, если я правильно понял ваш вопрос, поэтому я пытаюсь повторить его.
textfield="Name" valuefield="Id" selected-data="Id"
Если это так, вам нужно избавиться от двухсторонней привязки данных для вашего поля значений. Потому что вы хотите только указать строку (например, "Id" или "Name").
Я снова изменил ваш plunkr. Прежде всего я сделал новые переменные области видимости:
scope: {
'items': '=',
'urllink':'@',
'valuefield':'@',
'textfield':'=',
'Id':'=selectedData'
}
Valuefield теперь только привязка текста. Поэтому, если вы хотите изменить его угловым способом, вам нужно предоставить переменную области действия вне директивы и привязку '=' twoway внутри: D
$scope.autoFill = function (item) {
$scope.IsFocused = false;
$scope.searchtext = item.Name;
$scope.Id = item.Id;
$scope.textfield = item[$scope.valuefield];
}
Также я добавил последнее выражение к вашей функции автозаполнения. Имя свойства (поле значения) будет записано в переменную текстового поля, которая связана с вашей внешней областью (в данном случае "Имя"):
textfield="Name"
Если это не то, что вы просили, мне жаль, но я новичок в stackoverflow, и я все еще не могу комментировать: P