1

durandal でのエラー処理に苦労しています。

ビューなどをレンダリングするためのロジックの大部分を activate 関数に配置することが望ましいことがわかりました。

いくつかのプログラミングエラーが原因でアプリ全体が非常に静かに落ちることに気付くまで、これはうまく機能していました. つまり、コンソールに何も書き込まれず、トラップされたエラーもなく、アプリはアクティブ化機能でハングアップします。

これは予想される動作ですか。アプリのアプリケーション ロジックを別の場所に移動する必要がありますか?

実際のコードは少しぎこちなく、多くの部分が jquery の promise などでラップされています。

私が見たものを証明するために、私は次のように書きました。

    public activate(stationId: string): void {
        throw "Error in detail activate";
    }

コンソールには何も書き込まれず、アプリケーションがハングする以外に明らかなエラーは発生しませんでした。

すぐに起こること:

    public activate(stationId: string): void {
        setTimeout(function() { 
            throw "Error in detail activate";
        }, 0);
    }

この状況では、アクティブ化機能は進行しましたが、残念ながら、このエラーを追跡することもできませんでしたか?

アクティベート ポイントでアプリケーション ロジックを実行する方法を見つける必要があるのではないかと心配していますが、これらのエラーが単純に飲み込まれないようにすると便利です。

デュランダルについてもう少し調べて掘り下げました。

エラーはまだ消えます。エラーをログに記録しようとする Durandal による明白な試みにもかかわらず。私はactivator.jsのアクティブ化機能を探しています:

try {
    result = invoke(newItem, 'activate', activationData);
} catch (error) {
    system.error(error);
    callback(false);
    return;
}

基本的に、catch 条件が実行され、システム エラーが呼び出されます。結果はノックアウトバインディングなどに消えているようです。とにかく、このエラーをより見やすくする方法はありますか? 今のところ、activator.js の activate 関数にブレークポイントを設定することに行き詰まっています。

durandal の v2.0.1 を使用しています。

4

1 に答える 1

0

system.debug を有効にします。これにより、durandal はこれらのエラーをコンソールに記録できるようになります。

たとえば、最初のブートモジュールで

define(['durandal/app', 'durandal/viewLocator', 
    'durandal/system', 'plugins/router', 'services/logger'], boot);

function boot (app, viewLocator, system, router, logger) {

    // Enable debug message to show in the console 
    system.debug(true);

    // and so on
}

これは canActivate() で機能し、setTimeout() を使用すると activate() でも機能します。ただし、setTimeout() なしでは activate() では機能しないようです。

デバッグ:

setTimeout を呼び出さずに canActivate() のロジックを実行すると、デュランダル システム、ルーター、および jquery からの内部メソッドのみを含むスタック トレースが生成されます。問題のある行を探し回る必要があります。

ただし、setTimeout() の呼び出しを介してロジックを実行すると、エラーが発生した正確な場所を示すスタック トレースが得られます。

于 2014-04-23T08:40:00.523 に答える