1

次のような単純な MVC モデルがあります。

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MobileNumber { get; set; }
    public string EmailAddress { get; set; }
}

このタイプの 1 つのオブジェクトをノックアウト ビューモデル内にマップして、データを入力したいと思います。

var UserViewModel = function () {
    var self = this;
    self.user = ko.mapping.fromJS({});
    $.getJSON("/UserManagement/CreateEmptyUser", function (data) {
        ko.mapping.fromJS(data, self.user);
    });
    self.createUser = function (data, eventArgs) {
        var user = data;
        $.ajax({
            type: "post",
            contentType: "application/json",
            data: ko.toJSON(user),
            url: "@Url.Action("CreateUser")",
            success: function () {
                window.location = "@Url.Action("AddNew")";
            }
        });
    };
};

私が抱えている問題は、単一のオブジェクトをマップする方法がわからないことです。使ってみました

self.user = ko.mapping.fromJS([]);
$.getJSON("/UserManagement/CreateEmptyUser", function (data) {
        ko.mapping.fromJS(data,{}, self.user);
    });

これは配列に使用されており、インデックス 0 の要素を抽出しようとしています。私がうまくいくと思ったもう 1 つの解決策は、2 番目のコメント ブロックにあるものです。Googleで見つけたものはすべて、配列全体をマッピングすることにつながりましたが、単純なオブジェクトマッピングには何もなりませんでした。これを行う適切な方法はありますか?モデルを分離したままにしておき、JavaScript でそのプロパティを手動で記述したくありません。

ありがとう、アレックス・バラク

4

3 に答える 3

3

あなたの問題は、メソッドからのマッピングを使用してビューモデルをインスタンス化していることだと思います。これにより、プロパティが与えられないため、JSON 呼び出しの後にデータをマップしようとすると、入力する self.user にプロパティがありません。そこに必要なプロパティを使用してユーザー オブジェクトを作成するか、最初に mapping.fromJS を使用してビューモデルを作成します。

self.user = { FirstName: ko.observable(''), etc... }

マッピング行をそのままにしておくか、または

self.user;
$.getJSON("/UserManagement/CreateEmptyUser", function (data) {
    self.user = ko.mapping.fromJS(data);
}
于 2013-07-15T12:51:51.080 に答える
0

私は作業を続け、これをチェックして、最初に望んでいた解決策を見つけました. このアイデアは、@Paul Manzotti の提案を使用しています。

self.user;
$.getJSON("/UserManagement/CreateEmptyUser", function (data) {
    self.user = ko.mapping.fromJS(data);
}

self.user;self.user={};とに置き換えます

self.user = ko.mapping.fromJS(data)

ko.mapping.fromJS(data,{},self.user);

これを使用する場合、ビューモデルですべてのオブジェクトのプロパティを手動で宣言する必要はありません。これが同じ問題に遭遇した人に役立つことを願っています.

于 2013-07-17T14:04:40.510 に答える
0

問題のviewModel自体がオブザーバブルである必要がある場合、OPが言及したようにマッピングを使用してオブザーバブル配列を返し、その配列の最初のアイテムを返すことがわかりました。これは、既存の observableArray にプッシュしたい ajax で 1 つのオブジェクトを返す場合にも役立ちます。これにはヘルパー関数があります:

koMappingUsingArray = function (jsObject, mapping) {
    var observableObjectArray = ko.observableArray();
    var objectArray = new Array(jsObject);
    ko.mapping.fromJS(objectArray, mapping, observableObjectArray);

    return observableObjectArray()[0];
};

そして、次のように呼び出します。

    self.myObject = ko.observable();

    $.ajax({
        type: "POST",
        url: "....",
        data: ko.mapping.toJSON(???),
        contentType: "application/json; charset=utf-8",
        success: function (returnedObject) {
            self.myObject (koMappingUsingArray(returnedObject));
        });
于 2015-08-28T08:31:07.403 に答える