4

ここで説明されているように、AngularJS は値型モデルにバインドできません。

サーバー側では、文字列のリストしかありません:

[Route("/path/{Id}", "GET, OPTIONS")]
public class MyModel
{
    public int Id { get; set; }

    public List<string> SomeListItems { get; set; }
}

( ng-model を入力に) ng-repeat を介してリスト項目にバインドしたい場合、ServiceStack がそれらを文字列の配列としてシリアル化するため、機能しません。

AngularJS バインディングで使用できるオブジェクトとしてリストとディクショナリをシリアル化および逆シリアル化するように ServiceStack シリアライザに指示することは可能ですか?

例えば

{
    "id": 1,
    "someListItems": [
        { "value": "Item1" },
        { "value": "Item2" },
        ...
    ]
}

辞書についても同じです。

私が見つけた唯一の解決策は a を返すことList<KeyValuePair<string, string>>ですが、それはサーバー側では非常に醜いです。

4

1 に答える 1

4

文字列のリストを連想配列に変換する必要があるのはなぜですか? AngularJs は、配列の反復処理を処理できます。

これを示すplnkrは次のとおりです。http://plnkr.co/edit/TcXxSBkt7NBkqNJhkSE1

基本的に、サーバーはオブジェクトを返し、プロパティ SomeListItems は配列です。

ng-repeatそれらを反復するために使用します

<ul>
    <li ng-repeat="item in data.SomeListItems">{{item}}</li>
  </ul>

クライアントまたはサーバーのデータ構造をマッサージすることで、この問題に対する解決策がいくつか見られます。

これは、サーバーから受信した文字列配列を連想配列に変換してクライアントで編集できるようにし、サーバーにポストするために 1 次元配列に再変換する方法を示すplnkrです。

逆に、サーバー上でこれを行うことができます。SomeListItems を動的なリストとして宣言すると、ServiceStack シリアライザーが処理できる匿名オブジェクトを含め、必要なものを何でも割り当てることができます (これはテストしていませんが、うまくいくと思います)。

[Route("/path/{Id}", "GET, OPTIONS")]
public class MyModel
{
    public int Id { get; set; }

    public List<dynamic> SomeListItems { get; set; }
}

// in a controller or service
var model = new MyModel() { Id = 1 };
model.SomeListItems =  new List<dynamic> {
  new { Key = 1, Value = "foo }, new {Key = 2, Value = "bar" }
}; // this should serialize to JSON as { Id: 1, SomeListItems: [ {Key: 1, Value: 'foo'}, {Key:2, Value = 'bar'}]}; which angular can handle nicely

または、より冗長でないカスタム クラスを指定することもできます。KeyValuePair<string, string>

public class JsonPayload
{ // yes, it's just a KVP, but it's much more concise
  public string Key {get;set;}
  public string Value {get;set;}
}

次に、モデルを再定義します

[Route("/path/{Id}", "GET, OPTIONS")]
public class MyModel
{
    public int Id { get; set; }

    public List<JsonPayload> SomeListItems { get; set; }
}

これはダイナミクスを使用するよりも少し冗長ですが、JSON シリアライゼーションは間違いなくこれを処理できるはずです。

于 2013-05-14T17:42:01.887 に答える