角。如何将ui.select注入指令,即使用xeditable?

时间:2016-01-08 18:39:22

标签: javascript angularjs x-editable ui-select

我正在使用xeditable和ui.select。我需要配置select with search以使用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未找到。 $selectuiSelectCtrl控制器,在uiSelect指令中使用。

看来,我需要将ui.select注入我的指令中,但我不知道如何执行此操作并保留当前的可编辑实例。

问题:如何将ui.select$select控制器注入我的指令?

如果我提供的详细信息不够,请告诉我。

已解决。我根据@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
                }
            });
        }]);

2 个答案:

答案 0 :(得分:1)

这假设你的问题是因为你没有正确地注入模块依赖(正如@uday所指出的那样)。

据我所知,您不能/不能向现有模块添加额外的模块化依赖项。以下内容将覆盖外部lib定义的xeditable模块,因为此语法定义模块(而不是让模块定义其他可注入构造)。

angular.module( <name>, <other-modules-array> )

相反,您需要在自己的模块中定义指令,确保引用您的xeditableui.select模块,如下所示:

angular.module( 'myApp', [ 'xeditable', 'ui.select' ])
.directive( 'editableUiSelect', [ 
    'editableDirectiveFactory', 
    'editableNgOptionsParser',
    function( editableDirectiveFactory, editableNgOptionsParser ) { 
        ...
    }
])

答案 1 :(得分:0)

你可以像这样依赖注射 var xeditable = angular.module('xeditable',['ui.select']);

现在ui.select将以xeditable提供。