0

さて、2 つの監視可能なデータソースがあります。1 つは TestRequest と呼ばれるモデルを使用し、そのモデルを複数持つことができます。もう 1 つは、TestRequest ごとに複数存在できる TestResult のモデルを使用します。依存グリッドにデータを入力するためにフィルタリングしている requestId データ項目があります。宣言型データと宣言型フィルターを使用すると、すべてが正常に機能します。フィルターを動的に設定すると、フィルター処理されたデータソースに新しいレコードを追加できなくなります。どうすればこれを回避できますか? データ ソースの変更イベントのハンドラーで「外部」ID を設定するつもりでした (これは、クライアント側の主キーを適切に維持する方法です)。また、ハンドラーから「追加」アクションが実行されていることを確認できますが、エディターのポップアップ (両方のグリッドでポップアップ編集を使用しています) が表示されませんか? 他に有効にする必要のある魔法はありますか?

コードを投稿する必要があるかどうか教えてください。html と js をサーバーに置いて、みんなが見て批判できるようにします :)

前もって感謝します。

関連する JavaScript:

var TestRequest = kendo.data.Model.define({
    id: "Id",
    fields: {
        "accessionNumber": { type: "string" },
        "specimenCollectionDate": { type: "date" },
        "specimenReceivedDate": { type: "date" },
        "resultReportDate": { type: "date" },
        "testDescription": { type: "string" },
        "relevantClincalInfo": { type: "string" },
        "specimenSource": { type: "string" },
        "resultStatus": { type: "string" },
        "reasonForTest": { type: "string" },
        "comments": { type: "string" }
    }
});

var testRequestDataSource = new kendo.data.DataSource({
    schema: {
        model: TestRequest
    }
});

testRequestDataSource.bind("change", function(e) {
    if (e.action === "add") {
        e.items[0].dirty = true;
        kendo.data.ObservableObject.fn.set.call(e.items[0], "Id", viewModel.testsResults.nextRequestId);
        viewModel.testsResults.nextRequestId++;
    }
});

var TestResult = kendo.data.Model.define({
    id: "Id",
    fields: {
        "requestId": {
            type: "number",
            editable: false
        },
        "foo": {
            type: "string"
        }
    }
});

var testResultDataSource = new kendo.data.DataSource({
    data: [
        {
            Id: 1,
            requestId: 1,
            foo: "bar"
        },
        {
            Id: 2,
            requestId: 1,
            foo: "baz"
        },
        {
            Id: 3,
            requestId: 2,
            foo: "beep"
        }
    ],
    schema: {
        model: TestResult
    },
    filter: {
        "field": "requestId",
        "operator": "eq",
        "value": 0
    }
});

testResultDataSource.bind("change", function(e){
    if (e.action === "add") {
        e.items[0].dirty = true;
        kendo.data.ObservableObject.fn.set.call(e.items[0], "Id", viewModel.testsResults.nextResulttId);
        viewModel.testsResults.nextResultId++;
    }
});

var viewModel = kendo.observable({
    ...
    testsResults: {
        nextRequestId: 1,
        nextResultId: 4,
        testRequests: testRequestDataSource,
        testResults: testResultDataSource,
        testRequestChange: function() {
            var selectedItems =testRequestGrid.select();
            var selectedRow = $(selectedItems[0]);
            var selectedUid = selectedRow.data("uid");
            var selectedData = testRequestGrid.dataSource.getByUid(selectedUid);
            var requestId = selectedData.id;
            this.testsResults.testResults.filter({
                "field":"requestId",
                "operator":"eq",
                "value": requestId
            });
        },
        testRequestEdited: function(e) {
            var uid = e.model.uid;
            // TODO: fix below code to use callback or better event
            setTimeout(function() {
                testRequestGrid.select(testRequestGrid.tbody.find(">tr[data-uid='"+uid+"']"));
            }, 100);
        },
        ....

....

HTML:

<div id="testsResults">
    <h2>Tests/Results</h2>
    <fieldset>
        <legend>Test Requests</legend>
        <div id="testRequests">
            <div data-role="grid"
                 data-bind="source: testsResults.testRequests, events: { change: testsResults.testRequestChange, save: testsResults.testRequestEdited }"
                 data-editable="popup"
                 data-selectable="true"
                 data-toolbar='["create"]'
                 data-columns='[{"field":"accessionNumber","title":"Accession #"},
                                {"field":"specimenCollectionDate", "title":"Specimen Collection Date", "hidden":"true"},
                                {"field":"specimenReceivedDate", "title":"Specimen Received Date", "hidden":"true"},
                                {"field":"resultReportDate", "title":"Result Report Date", "hidden":"true"},
                                {"field":"testDescription","title":"Test Description"},
                                {"field":"relevantClinicalInfo", "title":"Relevant Clinical Information", "hidden":"true"},
                                {"field":"specimenSource","title":"Specimen Source", "hidden":"true"},
                                {"field":"resultStatus","title":"Result Status","hidden":"true"},
                                {"field":"reasonForTest","title":"Reason For Test", "hidden":"true"},
                                {"field":"comments","title":"Comments","hidden":"true"},
                                {"command":["edit","destroy"], "title":" ", "width":"170px"}]'>
            </div>
        </div>
    </fieldset>
    <fieldset>
        <legend>Test Results</legend>
        <div id="testResults">
            <div data-role="grid"
                 data-bind="source: testsResults.testResults"
                 data-editable="popup"
                 data-selectable="true"
                 data-toolbar='["create"]'
                 data-columns='[{"field":"requestId","title": "Test Request ID", "hidden":"true"},
                                {"field":"foo", "title":"Foo"},
                                {"command":["edit","destroy"], "title":" ", "width":"170px"}]'>
            </div>
        </div>
    </fieldset>
</div>
4

1 に答える 1

0

わーい!私は自分の質問に答えることができます。問題は、新しいレコードがフィルターに一致しないため、編集ポップアップが表示されないことです。データ ソースの変更イベント ハンドラーに欠けていた部分を追加したところ、すべてうまく機能しました。

testResultDataSource.bind("change", function(e){
    if (e.action === "add") {
        e.items[0].dirty = true;
        kendo.data.ObservableObject.fn.set.call(e.items[0], "Id", viewModel.testsResults.nextResulttId);
        var filters = this.filter().filters;
        var requestId = filters[0].value;
        kendo.data.ObservableObject.fn.set.call(e.items[0], "requestId", requestId);
        viewModel.testsResults.nextResultId++;
}

});

于 2013-04-25T21:48:30.410 に答える