3

ノックアウト モデル内で MVC モデル パラメータを取得するためのベスト プラクティスは何ですか?

1) パラメータを 1 つだけ取得する必要がある場合は、次を使用してノックアウト ビュー モデル プロパティを設定できます。

this.firstName = @Model.FirstName;

2)モデル内に多数のプロパティがある場合は、次のことができます。

var modelData = function () { return @Html.Raw(Json.Encode(Model)); }();

そして後で使用する

this.firstName = modelData.FirstName;
this.lastName = modelData.LastName;
this.phoneNumber = modelData.PhoneNumber; 
etc.

3) Person モデル内に Collection がある場合はどうなりますか。人物モデルからコレクションを取得する最良の方法は何ですか?

たとえば、Person は FirstName、LastName、PhoneNumber などを持ち、本のリストを持ちます (各本にはタイル、著者、その他のプロパティがあります)。

次のようなものを使用できると思います:

var booksJSON = @Html.Raw(Json.Encode(Model.Books));

次に、ノックアウトの Person モデルで次を使用します。

self.books = ko.observableArray(booksJSON);

これは本だけを与えます。

しかし、Person に関するすべての情報 (FirstName、LastName、Phone、および多数のプロパティを含む本) を取得したい場合、これを行うための最良の方法は何ですか? どういうわけか Person モデル全体に​​使用Json.Encodeして、Person.Books を含むすべてのものから抜け出すことができますか、それとも複数に分割する必要がありますJson.Encode-sか??

4

2 に答える 2

0

単純な (一方向の) バインディングを作成する場合は、これで十分です。

var PersonViewModel = {};
$(function () {
    var personJSON = @Html.Raw(Json.Encode(Model));
    PersonViewModel = ko.observable(personJSON);
    ko.applyBindings(PersonViewModel, $("#person-container").get(0));
});

しかし、双方向バインディングが必要な場合、つまり、既存の配列への変更をサーバーにポストバックしたい場合は、すべてのプロパティをオブジェクト配列に作成しますko.observable。これは、knockoutjs のドキュメントによると、

オブジェクトを単に observableArray に入れるだけでは、そのオブジェクトのすべてのプロパティ自体が監視可能になるわけではありません。もちろん、必要に応じてこれらのプロパティを監視可能にすることもできますが、それは独立した選択です。observableArray は保持しているオブジェクトを追跡し、オブジェクトが追加または削除されたときにリスナーに通知します。

配列内の各オブジェクトのプロパティを作成するには、ko.observableこの汎用関数を使用できます。

function MakeArrayKoObservableObjectArray(arr) {
    var observableArr = [];
    for (var i = 0; i < arr.length; i++) {
        var observableObj = {}, obj = arr[i];
        for (var prop in obj) {
            if (obj.hasOwnProperty(prop)) {
                observableObj[prop] = ko.observable(obj[prop]);
            }
        }
        observableArr.push(observableObj);
    }
    return observableArr;
}

これで、このような関数を使用できます。

var personJSON = @Html.Raw(Json.Encode(Model));
personJSON.Books = MakeArrayKoObservableObjectArray(personJSON.Books);
PersonViewModel = ko.observable(personJSON);
于 2013-11-05T04:16:21.420 に答える