3

knockoutjs を使用して、大規模で複雑なデータをマップしようとしています。私は公開モジュールパターンを使用しています。

オブジェクトのすべての要素を監視可能にするために、マッピング プラグインを使用しています。しかし、私は問題にぶつかりました: ko.mapping.fromJS() を使用する例をどこにも見つけることができませ。 ajax 呼び出しが行われ、一部のデータが取得されました。つまり、初期データがないため、初期マッピングを null、空、またはデフォルトでいっぱいにする必要があります。

これは、関連する唯一の情報です

初期データなし/空のフォームのノックアウト JS マッピング プラグイン

しかし、これは実際には同じ問題を解決しません。少なくとも、同じ問題を解決することはできません。

そして、ここに大まかに私が持っているコードがあります。

var viewModel = function(){
    var farmyard = *** What?? ***;

    var refreshData = function(){
        var temp = null;
        $.ajax(
            // awesome server call etc
            success: function(data){
                temp = data;
            }
        );
        ko.mapping.fromJS(temp, farmyard);
    };

    return{
            farmyard: farmyard,
            refreshData: refreshData
        }
};

$(function(){
   var vm = new viewModel();
   ko.applybindings(vm);

   $('#something).on('click',function(){
       vm.refreshData();
   });
});

それで、私の質問は、このオブジェクトの初期ロードの農場は何ですか? 現時点では、これを機能させるために空のオブジェクトをセットアップし、すべてのオブジェクトのすべての要素をハンドコーディングする必要がありました。前述のように、マップされるオブジェクト階層は大きく複雑であるため、これは理想的ではありません。どんな助けでも大歓迎です。

ありがとう。

4

1 に答える 1

3

ViewBag プロパティの一部として空のデータ モデル (これは .NET MVC) をビューに送信し、Ngon (https://github.com/brooklynDev/NGon) というライブラリを使用して、これを解決しました。

public ViewREsult Index()
{
    var massiveDataModel = new MassiveDataModel();

    ViewBag.NGon.Stuff = massiveDataModel;

    return View();
}

そしてスクリプトで:

var viewModel = function(){
var farmyard = ko.mapping.fromJS(ngon.Stuff);

var refreshData = function(){
    var temp = null;
    $.ajax(
        // awesome server call etc
        success: function(data){
            temp = data;
        }
    );
    ko.mapping.fromJS(temp, farmyard);
};

return{
        farmyard: farmyard,
        refreshData: refreshData
    }
};

    $(function(){
       var vm = new viewModel();
       ko.applybindings(vm);

       $('#something).on('click',function(){
           vm.refreshData();
       });
    });

特定の方法で問題を解決しようとすることに夢中になり、明白な解決策が見えませんでした。異なる視点を提供してくれた Tyrsius に感謝します。

于 2012-11-13T08:18:28.260 に答える