Угловой. Как вставить ui.select в директиву, которая использует xeditable?

0

Я использую 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
                }
            });
        }]);
Теги:
x-editable
ui-select

2 ответа

1
Лучший ответ

Это делает предположение, что ваша проблема возникает из-за того, что вы неправильно вписываете зависимости модулей (как указано в @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 ) { 
        ...
    }
])
  • 0
    Спасибо за ответ! очень хорошая идея, я попытался добавить директиву в мой основной модуль, который имеет все зависимости (например, xeditable и ui.select ), но у меня все еще есть ошибка «$ select is ui.select ». $select является псевдонимом для uiSelectCtrl , как вы можете видеть здесь: github.com/angular-ui/ui-select/blob/master/dist/select.js#L805 . Что я делаю неправильно?
  • 0
    Другими словами, мне нужно использовать директиву uiSelect в моей собственной директиве (см. uiSelect var html ), но кажется, что $ select еще не визуализируется.
Показать ещё 1 комментарий
0

Вы можете сделать инъекцию зависимостей следующим образом: var xeditable = angular.module('xeditable', ['ui.select']);

Теперь ui.select будет доступен в xeditable.

  • 1
    angular.module( 'xeditable', ['ui.select'] ) перезапишет существующий модуль xeditable . Похоже, что OP пытается добавить к существующему модулю, а не определить его. Вы angular.module( 'editableUiSelect', ['ui.select'] ) виду angular.module( 'editableUiSelect', ['ui.select'] ) ?
  • 0
    @jusopi Да, я пытаюсь добавить ui.select в существующий модуль!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню