10

エラーをキャッチして修正し、プログラムの実行を継続したい。 http://jsfiddle.net/Gthv9/12/

しかし、私はそれをすることはできません !

「モデル 1 の再チェック」、「モデル 3 の再チェック」をクリックすると、問題ありません。

「Model1 の再チェック」、「Model2 の再チェック」、「Model3 の再チェック」をクリックすると、エラーが発生します。

Uncaught Error: Unable to parse bindings.
Message: ReferenceError: name3 is not defined;
Bindings value: text: name3 

なんで?

問題のコードを try-catch ブロック (viewModel.recheckData2() ) でラップしましたが、viewModel.recheckData3() をクリックするとアプリケーションがクラッシュします。

knockoutJS がエラー状態 (new model2()) を保存することは知っていますが、どうすればよいかわかりません。

どうすればエラーを適切にキャッチできますか?

ありがとう!

4

2 に答える 2

37

あなたの正確な目標を理解しているかどうかはわかりませんが、Knockout はこの種の問題に遭遇するとバインドを停止します.

問題が単に未定義の変数である場合、使用できるトリックの 1 つ$data.name3は、単にname3. 有効なオブジェクトから未定義のプロパティにアクセスしても、エラーは発生しません。

より堅牢なものが本当に必要な場合は、カスタム バインディング プロバイダーの使用を検討できます。

たとえば、次のような実際のバインディング プロバイダーへのクイック ラッパーを作成できます。

var ErrorHandlingBindingProvider = function() {
    var original = new ko.bindingProvider(); 

    //determine if an element has any bindings
    this.nodeHasBindings = original.nodeHasBindings;

    //return the bindings given a node and the bindingContext
    this.getBindings = function(node, bindingContext) {
        var result;
        try {
            result = original.getBindings(node, bindingContext);
        }
        catch (e) {
            if (console && console.log) {
                console.log("Error in binding: " + e.message);   
            }
        }

        return result;
    };
};

ko.bindingProvider.instance = new ErrorHandlingBindingProvider();

これにより、エラーがキャッチされ、ログに記録され、続行されます。もちろん、この「悪い」バインディングを持つ要素はバインドされません。それを処理したい既知の方法がある場合は、エラーをキャッチした後にそのロジックを追加できます。その要素 (ノード) と bindingContext を調べて、何をする必要があるかを判断したい場合があります。

サンプル: http://jsfiddle.net/rniemeyer/KxXqs/

更新: これは、バインド構文のエラーと、バインドされた値が実際に評価されるときのエラーをトラップ/ログに記録する 3.0+ のバージョンです。http://jsfiddle.net/rniemeyer/ecbn1dmy/

于 2012-10-30T13:55:49.403 に答える
1

@RPNiemeyer からのエラー ハンドラーに別の行を追加して、catch ブロックでエラーの原因となっているノードをコンソールします。これにより、複雑なページでエラーを簡単に見つけることができます。

if (console && console.log) {
            console.log("Error in binding: " + e.message);
            console.log("Node causing error:");
            console.log(node);
        }
于 2014-08-23T05:07:50.260 に答える