angularjs 명령어로 컨트롤러를 요구하는 방법
어떤 지시의 컨트롤러를 다른 각도에 포함시키는 방법을 가르쳐 주실 수 있나요?JS 디렉티브예를 들어 나는 다음과 같은 코드를 가지고 있다.
var app = angular.module('shop', []).
config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/', {
templateUrl: '/js/partials/home.html'
})
.when('/products', {
controller: 'ProductsController',
templateUrl: '/js/partials/products.html'
})
.when('/products/:productId', {
controller: 'ProductController',
templateUrl: '/js/partials/product.html'
});
}]);
app.directive('mainCtrl', function () {
return {
controller: function ($scope) {}
};
});
app.directive('addProduct', function () {
return {
restrict: 'C',
require: '^mainCtrl',
link: function (scope, lElement, attrs, mainCtrl) {
//console.log(cartController);
}
};
});
반드시 addProduct 디렉티브로 컨트롤러에 액세스 할 수 있어야 하는데 액세스 할 수 없습니다.더 좋은 방법이 있을까요?
운 좋게도 질문에 대한 댓글로 답변을 드렸습니다만, 완성도를 위해 완전한 답변을 올렸습니다.이 질문에는 "Answered"라고 표기할 수 있습니다.
컨트롤러의 공유에 의해 실현되는 것에 따라 다릅니다.같은 컨트롤러를 공유하거나(인스턴스는 다르지만), 같은 컨트롤러 인스턴스를 공유할 수 있습니다.
컨트롤러 공유
다음과 같이 2개의 디렉티브에 같은 방식을 전달함으로써2개의 디렉티브에서 같은 컨트롤러를 사용할 수 있습니다.
app.controller( 'MyCtrl', function ( $scope ) {
// do stuff...
});
app.directive( 'directiveOne', function () {
return {
controller: 'MyCtrl'
};
});
app.directive( 'directiveTwo', function () {
return {
controller: 'MyCtrl'
};
});
각 디렉티브는 컨트롤러의 자체 인스턴스를 가져오지만 이를 통해 원하는 수의 컴포넌트 간에 논리를 공유할 수 있습니다.
컨트롤러 필요
컨트롤러의 동일한 인스턴스를 공유하려면require
.
require
는 다른 디렉티브가 존재함을 보증하고 그 컨트롤러가 링크 기능의 파라미터로 포함됩니다.따라서 1개의 요소에 2개의 디렉티브가 있는 경우 디렉티브에 다른 디렉티브가 존재해야 하고 그 컨트롤러 메서드에 액세스 할 수 있습니다.이를 위한 일반적인 사용 사례는 다음과 같습니다.ngModel
.
^require
는 캐럿을 추가하여 현재 요소 외에 디렉티브 위의 요소를 체크하여 다른 디렉티브를 검색합니다.이를 통해 "서브 컴포넌트"가 컨트롤러를 통해 상위 컴포넌트와 통신할 수 있는 복잡한 컴포넌트를 만들 수 있습니다.예를 들어 탭이 있습니다.각 페인은 스위칭을 처리하기 위해 전체 탭과 통신할 수 있습니다.아코디언 세트를 사용하면 한 번에 1개만 열 수 있습니다.
어느 경우든 두 가지 지시사항을 함께 사용해야 합니다. require
컴포넌트간의 통신방법입니다.
상세한 것에 대하여는, 가이드 페이지를 참조해 주세요.
Mark Rajcok의 좋은 스택오버플로우 답변은 다음과 같습니다.
AngularJS 디렉티브 컨트롤러에는 부모 디렉티브 컨트롤러가 필요합니까?
이 매우 명확한 jsFiddle 링크:http://jsfiddle.net/mrajcok/StXFK/
<div ng-controller="MyCtrl">
<div screen>
<div component>
<div widget>
<button ng-click="widgetIt()">Woo Hoo</button>
</div>
</div>
</div>
</div>
자바스크립트
var myApp = angular.module('myApp',[])
.directive('screen', function() {
return {
scope: true,
controller: function() {
this.doSomethingScreeny = function() {
alert("screeny!");
}
}
}
})
.directive('component', function() {
return {
scope: true,
require: '^screen',
controller: function($scope) {
this.componentFunction = function() {
$scope.screenCtrl.doSomethingScreeny();
}
},
link: function(scope, element, attrs, screenCtrl) {
scope.screenCtrl = screenCtrl
}
}
})
.directive('widget', function() {
return {
scope: true,
require: "^component",
link: function(scope, element, attrs, componentCtrl) {
scope.widgetIt = function() {
componentCtrl.componentFunction();
};
}
}
})
//myApp.directive('myDirective', function() {});
//myApp.factory('myService', function() {});
function MyCtrl($scope) {
$scope.name = 'Superhero';
}
언급URL : https://stackoverflow.com/questions/15672709/how-to-require-a-controller-in-an-angularjs-directive
'source' 카테고리의 다른 글
빈 문자열에서 JSON.parse가 실패하는 이유는 무엇입니까? (0) | 2023.03.06 |
---|---|
angular를 사용하여 브라우저 뒤로 버튼 클릭 이벤트를 감지하는 방법 (0) | 2023.03.06 |
부모 pom.xml이 없는 spring-boot에서는 전쟁 패키징을 생성할 수 없습니다. (0) | 2023.03.06 |
조롱하는 모멘트()와 모멘트().형식은 joke를 사용합니다. (0) | 2023.03.06 |
스프링 부트에서의 복수 Data Source 및 Jdbc Template (> 1.1.0) (0) | 2023.03.06 |