3

私は自分のコードをここに投稿しました: http://jsfiddle.net/HYDU6/6/ これは、私が実際に作業しているもののかなり簡素化されたバージョンですが、私の問題の本質を捉えています。私のビューモデルは次のようになります:

var viewModel = {
    objects: {
        foo: [
            { text: "Foo's initial" },
        ],
        bar: [
            { text: "Bar's initial" },
        ]
    }
}

私は ko.mapping プラグインとインスタンス化用のハンドラーを使用していcreateます。この部分は正常に機能します。私が使うobjectsObjobjects.fooobjects.bar

var view = {};
ko.mapping.fromJS(viewModel, mapping, view);

私の問題は、新しいデータに基づいて更新されています。(つまり、サーバーからデータを取得します)。新しいデータのオブジェクトがあり、試みます

ko.mapping.fromJS(new_model, mapping, view);

これは間違っていると思いますが、広範囲に検索しても機能させることができませんでした。(信じてください、何日も経ちました。):とにかく、助けてくれてありがとう。

編集:だから私はほとんどそれを理解しました - 私はmapping.fromJSに大きく依存していて、特定のものはオブザーバブルにラップされていませんでした。とにかく create() の後に呼び出されるため、create() は必要なく、update() だけが必要であることに気付きました。同じような悩みをお持ちの方、教えてください!

4

1 に答える 1

4

ジョン、

ko.mapping を使用してデータを更新するときは、新しいアイテムを作成しないでください。UI は既に既存の項目にバインドされているため、既存の項目のプロパティの値を更新するだけです。新しいものを作成しないでください。投稿した例では、新しいオブジェクトをその場所に作成するのではなく、マップの「更新」メソッドを調整して、新しい値を正しい ko.observable プロパティに挿入する必要があります。ko.mapping の「更新」メソッドには、使用法に応じていくつかの異なるパラメーター リストがあり、3 番目のパラメーターはマップのターゲット オブジェクトです。そのオブジェクトのプロパティを更新する必要があります。

obj.target[label].items[0].text(obj.data[label][0].text);

しかし、それはちょっとした混乱です。フィドルのように「深い」オブジェクト階層を処理するために、おそらく第 2 レベルのマッピング (作成/更新) を作成する必要があります。たとえば、「foo/bar」レベルのオブジェクトの 1 つのマップと、子 Obj() オブジェクトの別のマップを使用した「update」内からの ko.fromJS への別の呼び出しです。

それを修正した後、別の「with」バインディング、または子配列の「foreach」バインディングを使用して修正できるいくつかの単純なバインディング エラーに遭遇します。

全体として、いくつかの一般的な落とし穴に遭遇しましたが、それほど深刻なものではありません。これらの落とし穴のいくつかについては、こちらのブログでもう少し詳しく知ることができます: http://ryanrahlf.com/getting-started-with-knockout-js-3-things-to-know-on-day-one/

これが役立つことを願っています!

于 2013-06-19T16:56:10.113 に答える