0

ノックアウトを使用して折りたたみ可能な行を持つテーブルを作成しようとしています。各「親」行はデータ構造の最上位にあり、各「子」行はメンバー配列の要素です。

サーバーからデータを更新すると問題が発生します。データは更新されますが、「親」行のチェックボックスがオフになっているため、DOMオブジェクトが置き換えられていることがわかります。タイマーを使用してデータを更新することで、この問題を実証するフィドルがあります。

http://jsfiddle.net/jdlogicman/m2LWk/

ネストされたforeachを使用する代わりに修正する{{each}} 必要があることを読みましたが、それを機能させることができません。上記のフィドルのコメントアウトされたセクションを参照してください。

既存の質問がこれに対処している場合、私はその方法を知ることができませんでした。どんな助けでも大歓迎です

4

1 に答える 1

0

チェックボックスの値を保存していないため、毎回クリアされます。以下のフィドルはあなたの問題を解決しますか?

http://jsfiddle.net/unklefolk/RYqTT/

<table>
    <thead>
        <th class="checkbox_th"/>
        <th class="name_th" align="left">Sample</th>
        <th class="status_th" align="left">Status</th>
    </thead>
    <tbody data-bind="template: {name: 'sampleRowTemplate', foreach: samples}"></tbody>
    <script type="text/x-jquery-tmpl" id="sampleRowTemplate">
        <tr>
            <td><input type="checkbox" name="select_sample" data-bind="checked: is_checked"/></td>
            <td><span data-bind='text: sample_name'/>   The checkbox =<span data-bind="text:is_checked"/></td>
            <td><span data-bind='text: ""'/><td/>
            </tr>
                {{each sample_runs()}}
                <tr>
                <td/>
                <td><span data-bind='text: $value.name'/></td>
                <td><span data-bind='text: $value.status'/></td>
            </tr>
                {{/each}}
                <!--
                <script type="text/x-jquery-tmpl" id="sampleRunTemplate">
                <td/>
                <td>${name}</td>
                <td>${status}</td>
            </script>
                <tr data-bind="template: {name: 'sampleRunTemplate', foreach: sample_runs  }"></tr>
                -->

            </script>
            </table>            


var mapping = {
    'samples': {
        key: function(item) {
            return ko.utils.unwrapObservable(item.id);
        },
        'sample_runs': {
            key: function(item) {
                return ko.utils.unwrapObservable(item.id);
            }
        }
    }
};

var data = {};
data.samples = [{
    id: "s1",
    sample_name: "AR008",
    is_checked: false,    
    sample_runs: [
        {
        id: "rs1",
        name: "run1",
        status: "done"}]}];
var viewModel = ko.mapping.fromJS(data, mapping);
ko.applyBindings(viewModel);

// update the data every 2 seconds
var i = 0;
setInterval(function() {
    var data = {};
    data.samples = [{
        id: "s1",
        sample_name: "AR008" + i,
        sample_runs: [
            {
            id: "rs1",
            name: "run" + i,
            status: "done" + i}]}];
    // is this right? updateFromJS is deprecated
    viewModel = ko.mapping.fromJS(data, viewModel);
    i++;
}, 2000);
于 2011-10-11T10:04:59.773 に答える