Есть ли способ найти ближайшую родительскую область внутри 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);
Смотрите, есть много способов. Один из способов может быть, вы можете проверить переменную, которая определена в этой области контроллера, как это
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 другого контроллера. Это означает, что если он не является контроллером, это приведет к неопределенному состоянию и приведет к другому состоянию.
Это не самый чистый подход, но вы всегда можете передать объект в область действия директивы.
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>
Лучшим решением было бы поставить любые функции, которые вам нужно использовать, как внутри службы, которые могут быть повторно использованы.
Вы можете попытаться использовать методы jqLite/jQuery из вашей директивы, чтобы пересечь DOM-дерево вверх и найти нужный родитель (element.parent()
и т.д.). Затем вы можете получить объект scope, связанный с этим родителем, вызывая метод scope()
на нем, который вы должны передать в качестве аргумента своей функции компиляции.
scope()
определен для любого элемента jqLite, вам не нужно искать элементы, которые определяют только контроллеры. Вот как вы можете получить доступ к области непосредственного родителя для вашей директивы: link: function (scope, element, attrs) { var parent = element.parent().scope(); element.on("click", function(){ parent.$apply("myVal = 'something else'") });
где myVal
- это свойство, определенное в родительской области (по отношению к вашей директиве).
что 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(...) { ... };
});
$broadcast
и$on
если вам нужно передать данные из директивы в другие части вашего приложения.