9

サーバーから受け取ったJsonオブジェクトを、バインディングで使用されるすべての必要な関数を含む事前定義されたJavascriptオブジェクトにマッピングする際に問題が発生しました

Javascriptコードは次のとおりです

function Person(FirstName, LastName, Friends) {
    var self = this;
    self.FirstName = ko.observable(FirstName);
    self.LastName = ko.observable(LastName);
    self.FullName = ko.computed(function () {
        return self.FirstName() + ' ' + self.LastName();
    })
    self.Friends = ko.observableArray(Friends);
    self.AddFriend = function () {
        self.Friends.push(new Person('new', 'friend'));
    };
    self.DeleteFriend = function (friend) {
        self.Friends.remove(friend);
    };      
}

var viewModel = new Person();

$(document).ready(function () {
    $.ajax({
        url: 'Home/GetPerson',
        dataType: 'json',
        type: 'GET',
        success: function (jsonResult) {
            viewModel = ko.mapping.fromJS(jsonResult);
            ko.applyBindings(viewModel);
        }
    });
});

HTML:

<p>First name: <input data-bind="value: FirstName" /></p>
<p>Last name: <input data-bind="value: LastName" /></p>
<p>Full name: <span data-bind="text: FullName" /></p>
<p>#Friends: <span data-bind="text: Friends().length" /></p>
@*Allow maximum of 5 friends*@
<p><button data-bind="click: AddFriend, text:'add new friend', enable:Friends().length < 5" /></p>
<br>
@*define how friends should be rendered*@
<table data-bind="foreach: Friends">
    <tr>
        <td>First name: <input data-bind="value: FirstName" /></td>
        <td>Last name: <input data-bind="value: LastName" /></td>
        <td>Full name: <span data-bind="text: FullName" /></td> 
        <td><button data-bind="click: function(){ $parent.DeleteFriend($data) }, text:'delete'"/></td> 
    </tr>
</table>

初期データを取得するためのServerSideMVCコードは次のようになります。

    public ActionResult GetPerson()
    {
         Person person = new Person{FirstName = "My", LastName="Name",
                        Friends = new List<Person>
                        {
                             new Person{FirstName = "Friend", LastName="Number1"},
                             new Person{FirstName = "Friend", LastName="Number2"}
                        }
        };
        return Json(person, JsonRequestBehavior.AllowGet);
    }

マッピングプラグインを使用してJsonをJavascriptオブジェクトにロードし、バインディングですべてが利用できるようにしようとしています(Add関数とFriendオブジェクトの計算されたプロパティ)。

マッピングプラグインを使用すると、機能しないようです。プラグインを使用する場合、バインディング中にAddFriendメソッドを使用することはできません。マッピングプラグインを使用してJavaScriptPersonオブジェクトにデータを入力することは可能ですか、それともすべてを手動で行う必要がありますか?

4

1 に答える 1

11

マッピングオプションをマッピングプラグインに渡すこと、具体的にはここでcreate説明するコールバックを確認できます。

何かのようなもの:

var mapping = {
    create: function(options) {
        var person = options.data,
            friends = ko.utils.arrayMap(person.Friends, function(friend) {
               return new Person(friend.FirstName, friend.LastName);   
            });

        return new Person(person.FirstName, person.LastName, friends);
    }
};

サンプル: http: //jsfiddle.net/rniemeyer/5EWDG/

ただし、この場合、マッピングプラグインから多くのパワーを得ることができず、Personコンストラクターを自分で呼び出し、Friends配列をコンストラクター内のPersonオブジェクトにマッピングすることなくそれを行うことができます: http:// jsfiddle .net / rniemeyer / mewZD /

HTMLからのもう1つの注意:コンテンツを含む要素については、開始タグと終了タグを指定していることを確認してください(コードではこのように指定されていません)spanbutton正しく指定しないとKOで問題が発生します。

于 2012-01-10T16:30:49.087 に答える