質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Q&A

解決済

1回答

2609閲覧

[Angularjs 1.4.8]ディレクティブの中のディレクティブのメソッドを、そのまた外側から呼び出したい

packpak

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

1グッド

0クリップ

投稿2016/02/28 08:17

初めまして。

Angularjsでアプリを開発しています。
以下のようなことをやりたいのですが、(Angularjsの理解不足もあって)実装をどうやっていいのかわかっていない状態です。
恐縮ですが、どなたか、ご助言をお願いしたく。

やりたいこと

順を追って。

jquery-uiみたいに、内容をDialog化するディレクティブを作りました。

javascript

1//(※)一部簡略化しています。 2angular.module('app').directive('dialog', function(){ 3 return { 4 restrict : 'E', 5 controller : ['$scope', function($scope){ 6 this.open = function() { /* 実装 */ } 7 // その他初期化処理 8 }], 9 controllerAs : 'dialog', 10 replace : true, 11 transclude : true, 12 template : '<div>' + 13 '<div' + 14 ' style="width: {{ dialog.dialogSize.width }}; height: {{ dialog.dialogSize.height }};"' + 15 ' ng-transclude>' + 16 '</div>' + 17 '</div>', 18 19 link : function(scope, element, attrs) { 20 // dialog化するコード... 21 } 22 }; 23});

以下のように、ダイアログごとの実装を別途ディレクティブ化して、そのテンプレートに埋め込みで使う予定です。

javascript

1//(※)一部簡略化しています。 2angular.module('app').directive('addDialog' { 3 restrict = 'E'; 4 controller = [AddDialogDirectiveController]; 5 controllerAs = 'addDialog'; 6 replace = true; 7 templateUrl = templateBaseUrl + '/add-dialog.html'; 8};

html

1<div> 2 <dialog> 3 実装 4 </dialog> 5</div>

次が本件なのですが、
この実装ディレクティブ<add-dialog>を埋め込んだHTMLソースから、<dialog>ディレクティブのメソッドを呼びたいのですが、どうやって呼び出すかがわからないのです。

HTML

1<add-dialog></add-dialog> 2 3<!-- できれば、こういう感じで呼び出したい・・・。 --> 4<button type="button" ng-click="addDialog.open()">+新しいデータ</button>

できれば、addDialogのスコープ?に乗っけたいのですが。。

よろしくお願いいたします。

ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。
あまりスマートではありませんが、解決を参考までに。

解決までのルーチン

  • そもそも、controller から controller に暗黙でメソッド伝搬させる(そうさせるHackを含めて)のってどうなの?(<add-dialog>がわざわざ隠蔽している実装を外部から直接アクセスさせるのは良くないですね。。)
  • 諦めて、それなりのハードコーディングを持ち込んで解決しました。

コンセプトコード

  • 質問時は使っていませんでしたが、TypeScriptのコードで失礼します。

dialog.ts

typescript

1class DialogDirective { 2 restrict = 'E'; 3 controller = ['$scope', DialogDirectiveController]; 4 controllerAs = 'dialog'; 5 scope = false; 6 bindToController = false; 7 replace = true; 8 transclude = true; 9 template = '<div class="c-dialog">' + 10 '<div' + 11 ' style="width: {{ dialog.dialogSize.width }}; height: {{ dialog.dialogSize.height }};"' + 12 ' ng-transclude>' + 13 '</div>' + 14 '</div>'; 15 16 public link(scope, element: JQuery, attrs, ctrl: DialogDirectiveController) { 17 ctrl.link(scope, element, attrs); 18 } 19};

dialogSupport.ts

TypeScript

1abstract class DialogSupportController { 2 protected ctrlDlg:any = null; 3 4 protected initDialogSupport(elm:JQuery) { 5 // link時、動的にDialogDirectiveを検索しcontrollerを取得しておく。 6 const $dlg = elm.find('.c-dialog'); 7 if ($dlg.length <= 0) { 8 console.error(`<dialog> is not found! at following...`); 9 console.error(elm); 10 } 11 this.ctrlDlg = angular.element($dlg.get(0)).controller('dialog'); 12 console.assert(this.ctrlDlg, `DialogDirective unregistered!`); 13 } 14 15 public open() { 16 if (this.ctrlDlg) { 17 this.ctrlDlg.open(); 18 } 19 } 20 public close() { 21 if (this.ctrlDlg) { 22 this.ctrlDlg.close(); 23 } 24 } 25}

addDialog.ts

TypeScript

1import {DialogSupportController} from './common/dialogSupport'; 2import {DialogDirectiveController} from './dialog'; 3import {appName, templateBaseUrl} from '../constants'; 4 5class AddDialogDirectiveController extends DialogSupportController { 6 constructor() { 7 super(); 8 } 9 10 public link(scope, element, attrs) { 11 this.initDialogSupport(element); 12 } 13}; 14 15class AddDialogDirective { 16 restrict = 'E'; 17 controller = [AddDialogDirectiveController]; 18 controllerAs = 'addDialog'; 19 replace = true; 20 templateUrl = templateBaseUrl + '/add-dialog.html'; 21 22 public link(scope, element, attrs, ctrl) { 23 ctrl.link(scope, element, attrs); 24 } 25}; 26 27angular.module(appName).directive('addDialog', function(){ return new AddDialogDirective(); } );

投稿2016/02/28 17:33

packpak

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

packpak

2016/02/28 17:59

あれ・・・自己解決って書いた後に自分でベストアンサー指定するのですか?? なんか、すごく、虚しいのです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問