0

HTML フロントエンド (主にビュー) と Python バックエンド (主にドキュメント) を使用してデスクトップ アプリケーションを開発しています。

ドキュメントは入力要素を使用して更新されます。ビューは updateView 関数を呼び出して更新されます (ドキュメントを開く、元に戻す/やり直す、ギズモなど)。

そのため、ユーザーが何かを入力したときにドキュメントに通知する必要があります。変更は、オブザーバブルをサブスクライブし、updateDocument を呼び出すことによって検出されます。

主な問題は、ビューがバックエンドによって直接更新された場合、ドキュメントに通知する必要がないことです。

ドキュメントに再度通知せずに updateView を使用してビューを更新するにはどうすればよいでしょうか?

HTML を表示:

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />

        <script type="text/javascript" src="jsext/jquery-2.0.3.min.js"></script>
        <script type="text/javascript" src="jsext/knockout-2.3.0.js"></script>
        <script type="text/javascript" src="jsext/knockout.mapping.js"></script>

        <script type="text/javascript" src="js/document.js"></script>
        <script type="text/javascript" src="js/view.js"></script>

    </head>

    <body>
        <div id="datas">            
            <div>
                <p>
                    <label>x : </label>
                    <input type="text" data-bind="value: x"/>
                </p>
                <p>
                    <label>y : </label>
                    <input type="text" data-bind="value: y"/>
                </p>
                <p>
                    <label>z : </label>
                    <input type="text" data-bind="value: z"/>
                </p>
                <p>
                    <label>rx : </label>
                    <input type="text" data-bind="value: rx"/>
                </p>
                <p>
                    <label>ry : </label>
                    <input type="text" data-bind="value: ry"/>
                </p>
                <p>
                    <label>rz : </label>
                    <input type="text" data-bind="value: rz"/>
                </p>
                <p>
                    <label>s : </label>
                    <input type="text" data-bind="value: s"/>
                </p>
            </div>
        </div>
    </body>
</html>

JS を表示:

var _viewModel;
var subscriptions = [];

$(document).ready(function(){
    _viewModel = new Transform( );
    ko.applyBindings( _viewModel );
} );

function makeObservable() {
    var ob = ko.observable( 0.0 );
    ob.subscribe( function (val) {
        updateDocument( ko.toJSON( _viewModel ) );
    });
    return ob;
}

function Transform() {
    this.__type__ = makeObservable();
    this.x = makeObservable();
    this.y = makeObservable();
    this.z = makeObservable();
    this.rx = makeObservable();
    this.ry = makeObservable();
    this.rz = makeObservable();
    this.s = makeObservable();
}

function updateView( jsonDocument ){
    var jsonDocument = JSON.parse( jsonDocument );           
    _viewModel.x( jsonDocument[ "x" ] );
    _viewModel.y( jsonDocument[ "y" ] );
    _viewModel.z( jsonDocument[ "z" ] );
    _viewModel.rx( jsonDocument[ "rx" ] );
    _viewModel.ry( jsonDocument[ "ry" ] );
    _viewModel.rz( jsonDocument[ "rz" ] );
    _viewModel.s( jsonDocument[ "s" ] );
    _viewModel.__type__( jsonDocument[ "__type__" ] );
}

ありがとう

4

1 に答える 1

0

イベント ハンドラを無効にするには、silentUpdate という名前のフィールドを追加します。

function makeObservable() {
    var ob = ko.observable( 0.0 );
    ob.subscribe( function (val) {
        if(_viewModel.silentUpdate) return;
        updateDocument( ko.toJSON( _viewModel ) );
    });
    return ob;
}


function Transform() {
    this.silentUpdate = false;
    ...
}

function updateView( jsonDocument ){
    _viewModel.silentUpdate = true;
    var jsonDocument = JSON.parse( jsonDocument );           
    _viewModel.x( jsonDocument[ "x" ] );
    ...
    _viewModel.__type__( jsonDocument[ "__type__" ] );
    _viewModel.silentUpdate = false;
}

お役に立てば幸いです。

于 2013-07-22T11:00:06.083 に答える