2016-09-02 8 views
2

角度素材UIフレームワークを使用するAngularJSアプリがあります。角度素材を使用すると、特定のダイアログを閉じることができます

アプリにはダイアログ(例:エラーとローディングスピナー)を示すさまざまなメカニズムがあり、特定のシナリオで特に選択されたものを閉じることが望ましいでしょう。 AJAXリクエストのデータ取得が終了したら、ローディングスピナーを閉じるが、フェッチの結果である可能性のあるエラーダイアログは表示されません。

私はドキュメントで見つけることができますし、コードが(コードは、引数に勝つ必要がありますが)一致しないもの:

  • Documentation

  • The codeは言うオプションの応答で、閉じることができる唯一の最新語ります最新のオープン最新または全ての数は、オプションの理由
  • Example in the documentationで、閉じることができ、特定のダイアログがどのようにか、なぜ
示すフラグで、閉じることができ語ります -

私はできるだけMCVとして、demo of my intentをしたこれらのハイライトです:

var dialog = {}, 
    promise = {}; 

function showDialogs(sourceEvent) { 
    showDialog(sourceEvent, "one"); 
    showDialog(sourceEvent, "two"); 
} 

function showDialog(sourceEvent, id) { 
    dialog[id] = $mdDialog.alert({...}); 

    promise[id] = $mdDialog.show(dialog[id]); 
    promise[id].finally(function() { 
     dialog[id] = undefined; 
    }); 
} 

function closeDialogs() { 
    $mdDialog.hide("Closed all for a reason", {closeAll: true}); 
} 

function closeDialogLatest() { 
    $mdDialog.hide("Closed from the outside"); 
} 

function closeDialogReason() { 
    $mdDialog.hide("Closed with a reason"); 
} 

function closeDialogSpecific(id) { 
    $mdDialog.hide(dialog[id], "finished"); 
} 

EDIT:
私は、コードは常に何が起こるかについての議論を勝利知っているが、私は完全に確認されませんでしたそれは私が見ていた正しいコードでした。
私は、より良いテストと私のポイントと問題を説明するための例を更新しました。これはコードが言ったように働くことを示しています。

私が本当に探しているのは、私がまだ考えていない他の方法で目標を達成することがまだ可能かもしれないかどうかということです。

+1

おそらくドキュメントが間違っているか、古すぎます。ドキュメンテーションは、著者が何を望んでいても言うことができます。もしコードが不可能であると言えば、実際には不可能です。ごめんなさい。 – RicoBrassers

+0

私はコードが重要であることを知っていますが、私はそれが私が見ている正しいコードであることを完全には確信していませんでした。それはコードが言ったように私が作った例がうまくいくことを示したが、私がまだ考えていない何か他の方法で私の目標を達成することはまだ可能かもしれない。 – Flygenring

答えて

3

$mdDialogの代わりに$mdPanelを使用して、私は所望の効果を達成することができた。 demoに変更を反映させました。これはハイライトです:

var dialog = {}; 

function showDialogs() { 
    showDialog("one"); 
    showDialog("two"); 
} 

function showDialog(id) { 
    var config = {...}; 

    $mdPanel.open(config) 
     .then(function(panelRef) { 
      dialog[id] = panelRef; 
     }); 
} 

function closeDialogs() { 
    var id; 

    for(id in dialog) { 
     closeDialogSpecific(id, "Closed all for a reason"); 
    } 
} 

function closeDialogSpecific(id, reason) { 
    var message = reason || "finished: " + id; 

    if(!dialog.hasOwnProperty(id) || !angular.isObject(dialog[id])) { 
     return; 
    } 

    if(dialog[id] && dialog[id].close) { 
     dialog[id].close() 
      .then(function() { 
       vm.feedback = message; 
      }); 
     dialog[id] = undefined; 
    } 
} 
2

Googleのマテリアルデザインでは、2つ以上のダイアログを同時に表示させることは理想的ではないと思われます。彼らは、断続しているので、控えめにdocs

使用ダイアログから引用し

。 AJAXリクエストがデータをフェッチ終了すると

が、私は閉じるように私の ロードスピナーをしたいと思いますが、フェッチの 結果であるかもしれない任意のエラーダイアログ:

あなたが言います。

ここでの解決方法は、最初にスピナーを表示するダイアログを1つ作成することです。要求が完了したら、スピナーを任意のメッセージで置き換えます。

+0

私はあまりにも多くのダイアログがあってはならないことに同意し、フレームワークにスタックするようにビルドされているので、ある程度は大丈夫です。私がそれを行う理由は、作業を中断させるエラー(特に要求されたもの)をユーザーに知らせることで、データをロードしている間にすべてのやりとりをブロックする(つまり長いフォームを保存する)ため、ユーザーは物事が起こっていることを知っているが、 。 – Flygenring

+0

@Flygenringあなたは1つのダイアログですべてを達成することはできませんか? :-) –

+0

私は可能かもしれませんが、組み込みの例外処理にフックすることでエラー処理(ダイアログを含む)が一元的に処理され、ロードは特定のアクションに直接適用されるため、システム全体の再構築が必要になります。しかし、提案は非常に感謝しています! :-) – Flygenring

関連する問題