2

Knockout を始めて、ゆっくりと慣れてきました。新しいプロジェクトで使用しようとしていますが、うまく機能させるのに苦労しています。簡単な例 (ko.observables にバインドされたテキスト ボックス、または ko.observableArray にバインドされたテーブルまたはリストを含む単純なフォーム) は理解し、実行できますが、組み合わせの正しい構文を取得することはできません。 Web サービスを介してデータを送信し、データベースに保存するために、データを JSON 形式に変換します。

基本的に、これはデータ入力フォームで、いくつかのテキスト入力ボックスと項目のリスト (会社情報と従業員のリストを考えてください) があります。

ここにサンプルの Fiddle があります: http://jsfiddle.net/rhzu6/

saveData 関数では、データをパッケージ化するために何をすべきかわかりません。ko.toJS(self) を実行すると、「オブジェクト」が表示されるだけです。

データをオブジェクトとして定義しようとしましたが、すぐに迷子になりました。

function Company(CompanyName, ZipCode) {

    var self = this;
    self.ZipCode = ko.observable(ZipCode);
    self.CompanyName = ko.observable(CompanyName );
    self.Employees = ko.observableArray();
}

function Employee(FirstName, LastNameB) {
    var self = this;
    self.FirstName = ko.observable(FirstName);
    self.LastName = ko.observable(LastName);
}

次に、ViewModel は次のようになりました。

function viewModel() {
    var self = this;
    self.Company = ko.observable(); // company?
    self.Employees = ko.observableArray(); // ?
}

しかし、同じ問題に遭遇しました。また、バインディングの問題もありました- data-bind:"value: CompanyName" は、CompanyName が何であるかがわからないという例外をスローしました...

私を困惑させてください。私が見逃しているのは簡単なことだと確信しています。

ありとあらゆる助けをいただければ幸いです。

ありがとう

4

2 に答える 2

0

You are looking for ko.toJSON which will first call ko.toJS on your ViewModel and afterwards JSON.stringify.

ko.toJS will convert your knockout model to a simple JavaScript object, hence replacing all observables etc. with their respective values.

I updated your Fiddle to demonstrate.

For more info, take a look at this post from Ryan Niemeyers blog.

An alternative is to make use of ko.utils.postJson:

ko.utils.postJson(location.href, {model: ko.toJS(viewModel) });

Notice the ko.toJS again.

于 2013-01-09T16:20:58.750 に答える
0

あなたが(意味的に)フォームを送信したいように見えます。したがって、 submit bindingを使用する必要があると思います。最大の利点は、submit イベントをリッスンすることです。これにより、Ctrl+Enter やその他の任意のキーボードの組み合わせなど、他の手段で送信できます。

以下は、submitEvent ハンドラーがどのように見えるかの例です。ko.mapperを使用していることに注意してください。これは、任意の JS/JSON オブジェクトから viewModel を作成する優れた方法です。通常、次のようになります。

[バックエンド モデル] ->シリアル化-> [JS/JSON-ojbect] -> ko.mapper.fromJSON(obj) ->ワイヤード ビューモデルをノックアウトします。

viewModel.submitEvent = function () {
    if (viewModel.isValid()) { //if you are using knockout validate
        $.ajax(
            {
                url: '/MyBackend/Add',
                contentType: 'application/json',    
                type: 'POST',
                data: ko.mapping.toJSON(viewModel.entityToValidateOnBackend),
                success: function (result) {
                    ko.mapping.fromJSON(result, viewModel);
                }
            }
        );
    }
};

幸運を!

于 2013-01-10T09:31:16.423 に答える