Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 扩展UI选择控制器(角度)_Javascript_Angularjs_Inheritance_Decorator_Angular Ui Select - Fatal编程技术网

Javascript 扩展UI选择控制器(角度)

Javascript 扩展UI选择控制器(角度),javascript,angularjs,inheritance,decorator,angular-ui-select,Javascript,Angularjs,Inheritance,Decorator,Angular Ui Select,我正在尝试扩展ui select(版本0.17.1)以使其在单击时刷新。这里有一个例子(),我一直用它作为起点 我希望这种情况在应用程序范围内发生,所以我用我自己的包含div按钮的ui选择指令html替换了ui选择指令html。我还添加了一个装饰器,用一个尚未定义的新控制器替换指令控制器 myapp.app.config(function(provide) { $provide.decorator("uiSelectDirective", [ "$delegate", "uiSelect

我正在尝试扩展ui select(版本0.17.1)以使其在单击时刷新。这里有一个例子(),我一直用它作为起点

我希望这种情况在应用程序范围内发生,所以我用我自己的包含div按钮的ui选择指令html替换了ui选择指令html。我还添加了一个装饰器,用一个尚未定义的新控制器替换指令控制器

myapp.app.config(function(provide) {
    $provide.decorator("uiSelectDirective", [ "$delegate", "uiSelectConfig", "$controller"], function ($delegate, uiSelectConfig, $controller) {
        var directive = $delegate[0];
        // This line throws error Unknown provider
        var $select = $controller('uiSelectCtrl');

        return $delegate;
    }]);
});
我的问题是,我还想装饰/扩展控制器,以便在整个应用程序中添加额外的功能。我不想全部重写它,所以我正在寻找合适的方法来扩展这样一个控制器


谢谢。

我通过重载指令的编译方法解决了这个问题:

$provide.decorator('uiSelectDirective', ['$delegate', function ($delegate) {
    var directive = $delegate[0];
    var compile = directive.compile;

    directive.compile = function (tElement, tAttrs) {
        var link = compile.apply(this, arguments);
        return function (scope, element, attrs, ngModel) {
            link.apply(this, arguments);
            var ctrl = ngModel[0];
            var activate = ctrl.activate;

            //I had to close the dropdown when clicking on the directive
            ctrl.activate = function (initSearchValue, avoidReset) {
                if (!ctrl.disabled) {
                    if (ctrl.open) {
                        ctrl.close();
                    } else {
                        activate(initSearchValue, avoidReset);
                    }
                }
            }
        };
    };

    return $delegate;
}]);