1

問題の説明

ノックアウト js でリスト Exbando オブジェクトを使用する方法についてお聞きしたかったのですが、Rob Conrey の Massive を使用しており、返された結果はすべて動的です。それで問題ありませんが、私のニーズには合っていますが、結果をノックアウトに送信することに関しては、私はしません」どうしたらいいのかわからない。

ゴール

obj.Name、obj.Brand などのオブジェクト プロパティへのアクセス...

サンプルコード

意見:

<div data-bind="foreach: Products">
    <p>Product name: <strong data-bind="text: Name"></strong></p>
</div>

コントローラ:

public JsonResult GetProducts() 
{
     Products products = new Products();
     var Model = products.GetAllProducts();
     return Json(Model, JsonRequestBehavior.AllowGet);
}

GetProducts を呼び出した結果は次のとおりです。

[[{"キー":"ID","値":1},{"キー":"名前","値":"バダス ブーツ"},{"キー":"ブランド","値": "Nike"},{"Key":"Description","Value":"空を飛べる最高にクールなブーツ (本当じゃない!)"}, etc...]]

スクリプト ファイル:

function ProductListViewModel() {
    // Data
    var self = this;
    self.Products = ko.observableArray([]);

    $.getJSON("/Home/GetProducts", function (data) {
        self.Products(data);
    });
}

アプリケーション実行時の JavaScript エラー:

Uncaught ReferenceError: バインディングを解析できません。Bindings 値: テキスト: 名前 メッセージ: 名前が定義されていません

スクリーンショット 1:

ここに画像の説明を入力

スクリーンショット 2:

ここに画像の説明を入力

4

3 に答える 3

2

ExpandoObject一般的に言えば、すべての意図と目的のための辞書です。ここで JSON としてシリアル化すると、辞書として扱われ、キーと値のペアのコレクションになります (すべてのシリアライザーがこのように動作するわけではありませんが、使用しているシリアライザーは動作します)。名前でメンバーにアクセスできるオブジェクトではありません。可能な場合は、表現に変換する必要があります (または、最初にオブジェクトとしてシリアル化します)。

変換を行うことは、世界で最悪のことではありません。

function Product(item) {
    var self = this;
    // assuming item is an array of key/value pairs
    ko.utils.arrayForEach(item, function(pair) {
        // doesn't necessarily have to be mapped as an observable
        self[pair.Key] = ko.observable(pair.Value);
    });
}

これにより、結果を製品の配列にマッピングできます。

$.getJSON("/Home/GetProducts", function (data) {
    self.Products(ko.utils.arrayMap(data, function(item) {
        return new Product(item);
    }));
});
于 2013-09-29T17:00:00.710 に答える
1

ko.observableArray の値を json 配列に設定しようとしていることが問題のようです。これが機能するかどうかはわかりません。通常、これは私がそれを行う方法です:

function ProductListViewModel() {
   // Data
   var self = this;
   self.Products = ko.observableArray([]);

   $.getJSON("/Home/GetProducts", function (data) {
       ko.utils.arrayForEach(data, function(item) {
           self.Products.push({
               Name : item.Name
           });
       });
   });

}

ノックアウトの arrayForEach 関数を使用して json 配列を反復処理し、各オブジェクトを observableArray にプッシュします。

于 2013-09-29T13:56:20.217 に答える
0

あなたのJSONのようにKeyとのシーケンスが表示Valueされるので、相対値を取得して画面に表示するためにノックアウトが照会する必要があるファイル名を指定する必要があります。

したがって、に変更<strong data-bind="text: Name">する<strong data-bind="text: Key">と、これでうまくいくはずです。

于 2013-09-29T13:44:12.957 に答える