Найти ближайший контроллер области

0

Есть ли способ найти ближайшую родительскую область внутри directiv e, которая является scope контроля?

Случай использования.

Важной частью line 212 является js file.

Шаблон, который я визуализирую из директивы, имеет выражения scope переданные в атрибуте directive и мне нужно связать их с scope контроллера.

Поскольку директива имеет изолированную область действия, я связываю ее с scope.$parent потому что в этом случае родителем является контроллер.
Но это не всегда может быть, так как я могу найти ближайший родительский контроллер scope.

Могу ли я петля корыта scope проверки, если контроллер него scope?

var template = angular.element(html);
var linkFn = $compile(template);
var child = linkFn(scope.$parent); //HERE IS THE PROBLEM
$(element).append(child);
  • 1
    Это довольно вопиющий подход. Я бы порекомендовал вам посмотреть $broadcast и $on если вам нужно передать данные из директивы в другие части вашего приложения.
  • 0
    У меня не может быть другой директивы, слушающей трансляцию $ этого
Показать ещё 3 комментария
Теги:
angularjs-scope

4 ответа

2

Смотрите, есть много способов. Один из способов может быть, вы можете проверить переменную, которая определена в этой области контроллера, как это

if(angular.isDefined(scope.$parent.variableName))
{
   // controller is defined
}
else
{
   // controller is not defined
}

Если это определено, то это ваш контроллер, иначе что-то еще. Второй способ - проверить родительскую область родителя как это

if(angular.isDefined(scope.$parent.$parent)) {
  //controller is defined
}
else
{
  //controller is not defined
}

Поскольку каждый контроллер будет иметь родительский объект как $ rootScope или $ scope другого контроллера. Это означает, что если он не является контроллером, это приведет к неопределенному состоянию и приведет к другому состоянию.

2

Это не самый чистый подход, но вы всегда можете передать объект в область действия директивы.

angular.app('myApp', [])
    .controller('myCtrl', [function() {
        var self = this;
        self.directiveConfig = {
            method1: function() { /* do something cool */ },
            method2: function() { /* do something cool */ }
        };
    }])
    .directive('myElem', [function() {
        var myElem = {
            restrict: 'AE',
            controller: function() { /* some custom controller */ },
            link: function(scope, element, attributes, ctrl) {
                /** 
                 * scope.config will now be tied to self.directiveConfig 
                 * as defined in the controller above
                 */
            },
            scope: {
                config: '='
            }
        };
    });

Затем, если ваш контроллерAs настроен на ctrl, вы можете это сделать.

<my-elem config="ctrl.directiveConfig"></my-elem>

Лучшим решением было бы поставить любые функции, которые вам нужно использовать, как внутри службы, которые могут быть повторно использованы.

2

Вы можете попытаться использовать методы jqLite/jQuery из вашей директивы, чтобы пересечь DOM-дерево вверх и найти нужный родитель (element.parent() и т.д.). Затем вы можете получить объект scope, связанный с этим родителем, вызывая метод scope() на нем, который вы должны передать в качестве аргумента своей функции компиляции.

  • 0
    Что если я не знаю имя области действия контроллера, в которой находится директива? Есть ли в области действия контроллера что-то конкретное?
  • 0
    Метод scope() определен для любого элемента jqLite, вам не нужно искать элементы, которые определяют только контроллеры. Вот как вы можете получить доступ к области непосредственного родителя для вашей директивы: link: function (scope, element, attrs) { var parent = element.parent().scope(); element.on("click", function(){ parent.$apply("myVal = 'something else'") }); где myVal - это свойство, определенное в родительской области (по отношению к вашей директиве).
Показать ещё 2 комментария
1

что ngController кажется лучшим решением.

.directive("mobilitTree", function() {
    return {
        ...
        require: "ngController",
        ...
        link: function(scope, element, attrs, ngCtrl) {
            ...
        }
    };
})

.controller("AppController", function($scope, ...) {
    //Only variable applied on this are public
    this.controllerOnSort = function(...) { ... };
});
  • 1
    Ваш вопрос был о том, чтобы найти прицел, а не найти контроллер. Может быть, вы хотите изменить это соответственно.

Ещё вопросы

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