Я использую xeditable и ui.select. Мне нужно настроить select с помощью поиска для работы с xeditable. Итак, я создал директиву:
var xeditable = angular.module('xeditable');
xeditable.directive('editableUiSelect', ['editableDirectiveFactory', 'editableNgOptionsParser',
function(editableDirectiveFactory, editableNgOptionsParser) {
return editableDirectiveFactory({
directiveName: 'editableUiSelect',
inputTpl: '<span></span>',
render: function() {
this.parent.render.call(this);
var parsed = editableNgOptionsParser(this.attrs.eNgOptions);
var filter = " | filter: $select.search";
var html = "<ui-select ng-model='"+parsed.ngModel+"'>"+
"<ui-select-match>"+ "<span ng-bind='"+$select.selected.name+"'></span></ui-select-match>"+
"<ui-select-choices repeat='"+parsed.ngRepeat+filter+"'>"+"<span ng-bind='"+parsed.locals.displayFn+"'></span>"+
"</ui-select-choices></ui-select>";
this.inputEl.removeAttr('ng-model');
this.inputEl.removeAttr('ng-options');
this.inputEl.html(html);
},
autosubmit: function() {
// do smth
}
});
}]);
Это не работает, потому что $ select не найден. $select
- uiSelectCtrl
контроллер uiSelectCtrl
, который используется в директиве uiSelect
.
Кажется, мне нужно ввести ui.select
в мою директиву, но я понятия не имею, как это сделать и сохранить текущий xeditable экземпляр.
Вопрос: как я могу ввести ui.select
или только $select
controller в мою директиву?
Если подробности, которые я предоставил недостаточно, пожалуйста, дайте мне знать.
Решаемые. Я изменил свой директивный код в соответствии с ответом @jusopi и упаковал $select
и $parent.data
в кавычки, и все стали работать:
var Dashboard = angular.module('Dashboard');
Dashboard.directive('editableUiSelect', ['editableDirectiveFactory', 'editableNgOptionsParser',
function(editableDirectiveFactory, editableNgOptionsParser) {
return editableDirectiveFactory({
directiveName: 'editableUiSelect',
inputTpl: '<span></span>',
render: function() {
this.parent.render.call(this);
var parsed = editableNgOptionsParser(this.attrs.eNgOptions);
var filter = " | filter: $select.search";
var html = "<ui-select ng-model='$parent.data'>"+
"<ui-select-match>"+ "<span ng-bind='$select.selected.name'></span></ui-select-match>"+
"<ui-select-choices repeat='"+parsed.ngRepeat+filter+"'>"+"<span ng-bind='"+parsed.locals.displayFn+"'></span>"+
"</ui-select-choices></ui-select>";
this.inputEl.removeAttr('ng-model');
this.inputEl.removeAttr('ng-options');
this.inputEl.html(html);
},
autosubmit: function() {
// do smth
}
});
}]);
Это делает предположение, что ваша проблема возникает из-за того, что вы неправильно вписываете зависимости модулей (как указано в @uday).
Насколько я знаю, вы/не можете добавлять дополнительные модульные зависимости к существующему модулю. Следующее xeditable
бы xeditable
модуль, определенный вашей внешней lib, потому что этот синтаксис определяет модуль (в отличие от того, чтобы модуль определял дополнительные инъективные конструкции).
angular.module( <name>, <other-modules-array> )
Вместо этого вам нужно определить свою директиву в своем собственном модуле, убедившись, что вы xeditable
свои xeditable
и ui.select
модули следующим образом:
angular.module( 'myApp', [ 'xeditable', 'ui.select' ])
.directive( 'editableUiSelect', [
'editableDirectiveFactory',
'editableNgOptionsParser',
function( editableDirectiveFactory, editableNgOptionsParser ) {
...
}
])
Вы можете сделать инъекцию зависимостей следующим образом: var xeditable = angular.module('xeditable', ['ui.select']);
Теперь ui.select будет доступен в xeditable.
angular.module( 'xeditable', ['ui.select'] )
перезапишет существующий модуль xeditable
. Похоже, что OP пытается добавить к существующему модулю, а не определить его. Вы angular.module( 'editableUiSelect', ['ui.select'] )
виду angular.module( 'editableUiSelect', ['ui.select'] )
?
xeditable
иui.select
), но у меня все еще есть ошибка «$ select isui.select
».$select
является псевдонимом дляuiSelectCtrl
, как вы можете видеть здесь: github.com/angular-ui/ui-select/blob/master/dist/select.js#L805 . Что я делаю неправильно?uiSelect
в моей собственной директиве (см.uiSelect
var html
), но кажется, что $ select еще не визуализируется.