2014-07-24 15 views
22

Jest to proste pytanie, ale nie wydaje się znaleźć żadnej odpowiedniej dokumentacji ...Czy dyrektywa kątowa może wymagać własnego kontrolera?

Próbuję dowiedzieć się, czy kanciasty dyrektywa może dziedziczyć zarówno kontrolera nadrzędnego jak również jego własny. Rozważmy następujące przykłady:

Proste dziedziczenia po Jaźni

app.directive('screen', function() { 
    return { 
    scope: true, 
    controller: function() { 
     this.doSomething = function() { 

     }; 
    }, 
    link: function($scope, el, attrs, ctrl) { 
     // ctrl now contains `doSomething` 
    } 
    } 
}); 

dziedziczenia z rodzica

app.directive('screen', function() { 
    return { 
    scope: true, 
    controller: function() { 
     this.doSomething = function() { 

     }; 
    } 
    } 
}); 
app.directive('widget', function() { 
    return { 
    scope: true, 
    require: '^screen', 
    link: function($scope, el, attrs, ctrl) { 
     // ctrl now contains `doSomething` -- inherited from the `screen` directive 
    } 
    } 
}); 

Jest nawet wielokrotne dziedziczenie ...

app.directive('screen', function() { 
    return { 
    scope: true, 
    controller: function() { 
     this.doSomething = function() { 

     }; 
    } 
    } 
}); 
app.directive('widget', function() { 
    return { 
    scope: true, 
    require: ['^screen','^anotherParent'], 
    link: function($scope, el, attrs, ctrl) { 
     // ctrl[0] now contains `doSomething` -- inherited from the `screen` directive 
     // ctrl[1] now contains the controller inherited from `anotherParent` 
    } 
    } 
}); 

Czego nie rozumiem, jak sprawić, by dyrektywa dziedziczyła zarówno kontroler nadrzędny, jak i własny. Podobnie jak:

app.directive('screen', function() { 
    return { 
    scope: true, 
    controller: function() { 
     this.doSomething = function() { 

     }; 
    } 
    } 
}); 
app.directive('widget', function() { 
    return { 
    scope: true, 
    require: '^screen', 
    controller: function($scope) { 
     // isolated widget controller 
    }, 
    link: function($scope, el, attrs, ctrl) { 
     // I need the `screen` controller in ADDITION to the isolated widget controller accessible in the link 
    } 
    } 
}); 

Czy jest to możliwe/właściwe formularza (lub jest to pewnego rodzaju anty-wzór nie jestem świadomy)?

Odpowiedz

34

Cóż, okazało się to o wiele bardziej oczywiste niż sądziłem ... mała próba i błąd pokazały, że dyrektywa może również wymagać tego samego.

Właściwym sposobem dziedziczyć rodzic + lokalnych kontrolerów wydaje się być:

app.directive('screen', function() { 
    return { 
    scope: true, 
    controller: function() { 
     this.doSomething = function() { 

     }; 
    } 
    } 
}); 
app.directive('widget', function() { 
    return { 
    scope: true, 
    require: ['^screen','widget'], 
    controller: function($scope) { 
     this.widgetDoSomething = function() { 
     }; 
    }, 
    link: function($scope, el, attrs, ctrl) { 
     // ctrl[0] contains the `screen` controller 
     // ctrl[1] contains the local `widget` controller 
    } 
    } 
}); 
+0

tak właśnie robię to teraz ... Mój SO wyszukiwania ufałem odsłonić bardziej „elegancki” sposób . Domyślam się, że tak to się stało =/ – Roi

+0

Bardzo się cieszę, że zadałeś to pytanie, miałem trochę czasu na zastanowienie się nad tym. – richbai90

+0

Dlaczego potrzebujesz ^, aby wymagać dyrektywy ekranowej? – Winnemucca

Powiązane problemy