2017-02-06 10 views
1

지시문 (<partition>)이 하위 지시문의 제어기 (<property-value>)에서 메소드를 호출 할 수있는 각도로 계층 구조를 구현하는 방법에 대한 조언을 찾고 있습니다.자식 지시문에 대한 메서드를 호출하는 각도 지시문

여기 함께 자세한 예를 뒀다 :
https://jsfiddle.net/95kjjxkh/1/

당신이 볼 수 있듯이, 내 코드 내에서 하나 개 이상의 <property-value> 지시를 표시하는 외부 지시, <partition>가 포함되어 있습니다.

지시문 editItem()은 사용자가 단일 항목의 값을 변경할 수있는 편집 방법을 제공합니다. 여기에 임의의 숫자를 지정하기 만하면됩니다.하지만 프로덕션 앱에서는 새 값을 사용자에게 묻는 모달이 표시됩니다.

괜찮습니다. 그러나 외부 지시문 <partition>에서 새 비어있는 <property-value> 지시문을 만드는 기능을 추가하고 즉시 사용자가 초기 값을 입력 할 수 있도록 편집 방법을 호출하고 싶습니다. 초기 값을 입력하지 않으면 새 항목이 삭제됩니다.

내부 지시문을 사용하여 주변 지시문에 대한 메소드를 호출하는 예를 보았지만 그 반대의 경우는 없습니다.

이 방법이 있습니까? 또는, 이런 종류의 견해를 만드는 더 좋은 방법이 있습니까?

답변

0

언제나 $ broadcast를 사용하여 두 가지 방식으로 대화 할 수 있습니다. 부모뿐만 아니라 자녀에게도. 자녀 컨트롤러에서

0

당신이 파티션 컨트롤러에서이

link:function(scope,element,attrs,partitionCtrl){ 
    partitionCtrl.getChildCtrl(element) 
    } 

같은 자식 지침의 링크 기능의 부모 컨트롤러를 얻을 것이다이 다음과 같은

app.directive('propertyValue', function() { 
return { 
    require : '^partition' 
    restrict: 'E', 
    scope: { 
     item: '=' 
    }, 

을 할 수는 getChildCtrl 기능과과를 만들 그 "속성 값"컨트롤러 함수를 호출

controller: function ($scope, ItemFactory) { 
// your code 
var propValueCtrl =undefined; 
this.getChildCtrl =function(elem) 
{ 
    propValueCtrl = elem.controller(); 
} 
this.callChildFunction = function() 
{ 
    propValueCtrl.Edit();// whatever is the name of function 
} 

속성 링크 기능에서 필요할 때이 함수를 호출하십시오.

희망이 도움이됩니다.

+0

이 흥미로운 솔루션이지만, 불행하게도, 그것은 실제로 꽤 작업을 수행합니다. 필자는 코드를 새로운 Plunkr에 통합했으며 이것이 이상적이지 않은 이유를 설명하는 주석 (app.js : 52-61 행)을 추가했습니다. http://plnkr.co/edit/hHACVtZVxchkAopRKdhP?p=preview – BillyBBone

+0

죄송합니다. , 실수로 plnkr.co 링크를 삭제하고 위의 내 의견을 수정할 수 없습니다. JSFiddle의 코드는 다음과 같습니다 : https://jsfiddle.net/z72pb6wc/ – BillyBBone

+0

* 자식 함수가 호출되기 전에 지시어가 그려지는 가장 쉬운 방법은'$ timeout '. https : // jsfiddle.net/huvfyvhs/ – Claies

0

당신은 컨트롤러와 지침이 코드를 시도 할 $rootScope.$broadcast();를 사용할 수 있습니다

var app = angular.module('miniapp', []); 

app.directive("addCheckbox", function() { 
     return { 
      "restrict": "E", 
      "replace": true, 
      "scope": true, 
      "template": '<div><div class="checkContainer"><input type="checkbox" ng-model="checkboxChecked"></div><div>{{!!checkboxChecked}}</div></div>', 
      "link": function($scope, $elem, attrs) { 
        $elem.bind("click", function() { 
         $scope.checkboxChecked = !$scope.checkboxChecked; 
       }) 

     $scope.$on("changeCheckbox", function(event, args) { 
      $scope.checkboxChecked = !$scope.checkboxChecked; 
     }) 
     } 
    } 
}) 

app.controller("myController", function($scope, $rootScope) { 
    $scope.changeCheckbox = function() { 
     $scope.checkboxChecked = !$scope.checkboxChecked; 
     $rootScope.$broadcast('changeCheckbox', {}); 

    } 
}) 

Working Fiddle Demo

+0

귀하의 제출물과 실제 사례에 감사드립니다. 불행히도, 나는이 솔루션이 이상적이지 않다는 것을 느낍니다. 왜냐하면 확장 성이 좋지 않기 때문입니다. 하나 또는 소수의 리시버가 있으면 '$ broadcast'가 의미가 있습니다. 수백 개의 수신자가있는 경우 새 지시.이 추가 될 때마다 각각의 수신자가 호출됩니다. 수신기 중 하나만 실제로 어떤 동작을 취하도록'if' 문을 가지고 있더라도, 더 많은 속성 값이 파티션에 추가되면 성능이 떨어질 것입니다. – BillyBBone

관련 문제