Дисплей AngularStrap Dropdown вручную - как?
Я пытаюсь отобразить раскрывающийся список AngularStrap вручную, используя конфигурацию trigger
на $dropdownProvider
как таковой
// how dropdown is triggered - click | hover | focus | manual
app.config(function($dropdownProvider) {
angular.extend($dropdownProvider.defaults, {
trigger: 'manual'
});
});
click
hover
focus
все работает нормально, но почему бы не manual
? Я еще не нашел никаких доказательств того, что этот предлагаемый вариант конфигурации api работает. Как я могу это сделать?
Фактически, этот вопрос, кажется, был обнаружен после моего первоначального вопроса, но теперь он закрыт, и через год мне еще предстоит найти решение.
Проблема: Отсутствует документация о том, как использовать trigger = manual
Я пропустил пример, иллюстрирующий, с чем я борюсь. Чтобы прояснить мою цель, я хочу вызвать раскрывающийся список в моем <textarea>
при нажатии клавиши (ng-model
change). Я ищу, чтобы удержаться в раскрывающемся списке и вызвать функцию, чтобы вручную запускать ее, не используя ни один из параметров триггера по умолчанию, в частности trigger: manual
, и интуитивно понятным способом сделать это, как следует предлагать в соответствии с api, поэтому желаемое решение не должно ограничиваться каким-либо конкретным триггером - но полностью ручным, чтобы соответствовать многим различным обычаям.
Plunker Link
<textarea ng-model="expression" intellisense></textarea>
app.directive('intellisense', [function () {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
scope.$watch(attrs.ngModel, function (v) {
if(v) {
// how do I trigger dropdown here on keystroke (model change)?
}
});
}
}
}]);
Ответы
Ответ 1
Для всех, кто заинтересован, после копания исходного кода, я обнаружил атрибут директивы bsDropdown
, называемый bsShow
, со следующей реализацией.
// Visibility binding support
attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {
if(!dropdown || !angular.isDefined(newValue)) return;
if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(dropdown),?/i);
newValue === true ? dropdown.show() : dropdown.hide();
});
Это по существу приводит к разметке раскрывающегося списка, чтобы включить его и привязать к значению $scope
как таковой
<textarea id="textdrop" ng-model="expression" intellisense bs-dropdown="dropdown" bs-show="drop"></textarea>
Тогда в моей директиве я могу вызвать видимость, изменив $scope.drop
как связанный на bs-show="drop"
app.directive('intellisense', [function () {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
scope.$watch(attrs.ngModel, function (v) {
if(v) {
scope.drop = true; // simple - but works
} else {
scope.drop = false;
}
});
}
}
}]);
Похоже, что это было зафиксировано в проекте commit в качестве ссылки здесь. Официальная документация до сих пор не упоминает об этом как о времени написания, и учитывая сроки этого, я удивлен отсутствием внимания, которое это получило.
Plunker Link с trigger: manual
Ответ 2
Когда у меня есть выпадающее меню, как указано выше, и вы хотите запустить его вручную, я добавляю элемент id
к элементу:
<button id="myDropdown" type="button" class="btn btn-lg btn-primary" data-animation="am-flip-x" bs-dropdown="dropdown">
Click to toggle dropdown
</button>
а затем просто вызвать метод click()
:
$scope.dropdown = angular.element("#myDropdown");
...
$scope.dropdown.click();
demo → http://plnkr.co/edit/v5AuBOiMN6TZCPE4eYk2?p=preview
Это можно объединить с angular-hotkeys:
hotkeys.bindTo($scope)
.add({
combo: '<key-combination>',
description: '<description>',
callback: function() {
$scope.dropdown.click()
}
})
Ответ 3
Вручную запускать датупиксеров (или любой выпадающий список) теперь намного проще с v2.0.4 ngStrap. Для получения дополнительной информации см. этот комментарий Github.
Здесь рабочий планшет, чтобы продемонстрировать датупик как выпадающее меню вручную, и как встроенный вручную элемент.
<input type="text" ng-model="dropdownDatepicker.date" bs-datepicker data-trigger="manual" data-bs-show="dropdownDatepicker.show">
(И вам действительно даже не нужен data-trigger="manual"
, поэтому вы можете оставить это, если хотите).
Что касается директивы intellisense, это не похоже на проблему здесь, поэтому я оставлю это вам...