1

これは以前に尋ねられたと確信していますが、残念ながら見つけることができません-正しい方向に私を向ける助けがあれば大歓迎です.

ビュー/ビュー モデルを Durandal で読み込んでいます。Activate メソッド中に、単一のレコードを取得して表示するように呼び出しています。レコードを取得しています (XHR 応答を確認し、すべてのデータが正常に返されます) が、データを表示する準備が整う前にビューが読み込まれているとしか思えません。JS エラーはなく、エラーはまったくありませんが、データが表示されるべきであることを知っていても、画面の真ん中に大きな空白があります...

ビューモデル:

define(['durandal/system', 'services/logger', 'services/datacontext'], function (system, logger, datacontext) {
    var aForm = ko.observable();
    var initialized = false;

    function activate(routeData) {
        var id = parseInt(routeData.id);
        return refresh(id);
    };

    function refresh(id) {
        return datacontext.getaFormById(id, aForm);
    }

    var vm = {
        activate: activate,
        aForm: aForm,
        title: "THE TITLE DISPLAYS JUST FINE"
    }
    return vm;
});

意見 :

<h3 class="page-title" data-bind="text: title"></h3>

<div class="container-fluid" data-bind="with: aForm">
    <div class="row-fluid">
        <div class="span12">
            <strong>Testing</strong>
            <strong data-bind="text: id"></strong>        
        </div>
    </div>

    <h2 data-bind="text: description"></h2>
    <h2 data-bind="text: checkType().description"></h2>
</div>

私は強力なテストを投入しましたが、レンダリングすらせず、タイトルだけがレンダリングされます。誰かが私を正しい方向に向けることができますか? フィドルを作成しますが、ViewModel でデータをハードコーディングすると機能します。

編集 :

もう少し掘り下げた後、特に data.entity 戻り値の型で、オブジェクトを適切に返していない可能性があります。これにより問題が発生しますか?

    var getaFormById = function (aFormId, aFormObservable) {

        var query = EntityQuery.from('aForms')
            .where('id', '==', aFormId);

        return manager.executeQuery(query)
            .then(querySucceeded)
            .fail(queryFailed);

        function querySucceeded(data) {
            if (aObservable) {
                aObservable(data.entity);
            }
            logger.log('Retrieved selected [aForm] from remote data source', data, system.getModuleId(datacontext), true);
        }
    }
4

2 に答える 2

1

executeQueryUI が正しくレンダリングされない理由は、成功のコールバックでオブザーバブルを正しく入力していないためです。

executeQuery ドキュメントからsuccessFunction、次の引数で呼び出されます

successFunction([データ])

  • データオブジェクト
    • resultsエンティティの配列
    • ...

data.resultsしたがって、フォームではなく配列からオブザーバブルを埋める必要がありますdata.entity(未定義を返すだけです):

if (aObservable) {
   aObservable(data.results[0]);
}
于 2013-04-23T15:07:14.960 に答える
0

activate 関数から jQuery promise() を返すことで、Durandal にバインドを保留するように指示できます。

説明については、Ryan Keeter によるこのビデオを参照してください: http://www.youtube.com/watch?v=w_XjWg6xL8I

于 2013-04-24T12:06:36.567 に答える