通常、ディレクティブがコントローラーについて何も認識しないようにするため、コントローラーとディレクティブの間で通信する最良の (Angular) 方法は、双方向バインディングを使用することです。
あなたの状況では、ベスト プラクティスは、やはり IMO ですが、入力ではなく、ボタンのディレクティブを作成することだと思います。どの「入力」を (ID で) 監視するかをボタンに指示します。何かのようなもの:
<input id="input-{{item.id}}" type="text" ng-model="currMessage" />
<button class="btnMessage" ng-click="addMessage(currMessage, item)" default-input="input-{{item.id}}">Add</button>
ETA: ディレクティブは次のようになります
http://plnkr.co/edit/HhEAUUq0IZvzblbRksBH?p=preview
myApp.directive('defaultInput', function () {
return {
restrict:'A',
link: function(scope, element, attrs) {
attrs.$observe('defaultInput', function(value) {
var inputElement = angular.element(document).find('#' + value);
inputElement.bind('keydown', function(e) {
if (e.keyCode == 13) {
element.click();
}
});
});
}
};
});
$observe
コントローラーが変更されるたびにコールバックが発生するため、扱いが難しくなる可能性があるため、scope.items
何らかの方法でバインドを解除して再バインドする必要があります (jQuery を使用していることは知っていますがangular.unbind
、ドキュメントには表示されません)。
元のアプローチに固執したい場合は、別のオプション:
http://plnkr.co/edit/3X3usJJpaCccRTtJeYPF?p=preview
HTML
<input id="input-{{item.id}}" type="text" ng-model="currMessage" enter-fires-next-button />
JavaScript
myApp.directive('enterFiresNextButton', function() {
return function(scope, element, attrs){
element.on('keydown', function(e){
if(e.keyCode == 13) {
element.next('button').click();
}
});
}
});