dojo dgrig jsonrest把响应格式

时间:2013-11-13 09:22:56

标签: json yii dojo put dgrid

所以我有一个附加了dgrid的JsonRest商店。 我使用phpyii framework

如果我触发PUT,我会收到如下格式的响应: [{id: 1, abbreviation: 'FL' }] 这是row更新的正确形式吗? 或者我应该仅将{id: 1, abbreviation: 'FL' }作为回复?

谢谢!

更新#1:

    <div
    data-dojo-type="dijit.MenuBar"
    data-dojo-props="region:'top', layoutPriority:2, style:'margin-top: 10px'">
        <div
            id="OrderButton"
            data-dojo-type="dijit.form.Button">
            <span>Submit Order</span>
            <script type="dojo/on" data-dojo-event="Click">
                handleFinalizeOrder();
            </script>
        </div>
     <span class="right">Package Price: 20$ + 1$/pic</span><span id="results"></span>
</div>

<div id="imageList"></div>
<?php $this->beginDojoScript() ?>
<script type="text/javascript">
    require([
    'dojo/parser',
    'dojo/dom-construct',
    'dojo/dom-style',
    'dojo/_base/declare',
    'dojo/_base/xhr',
    'dojo/_base/loader',
    'dojo/_base/Deferred',
    'dojo/data/ItemFileWriteStore',
    'dojo/store/util/QueryResults',
    'dijit/Toolbar',
    'dijit/Tree',
    'dijit/TooltipDialog',
    'dijit/layout/StackContainer',
    'dijit/layout/ContentPane',
    'dijit/form/Button',
    'dijit/tree/ForestStoreModel',
    'dijit/form/Form',
    'dijit/form/ValidationTextBox',
    'dijit/form/DropDownButton',
    'dijit/form/CheckBox',
    'dojox/form/Uploader',
    'dojox/form/uploader/plugins/IFrame',
    'dgrid/OnDemandGrid',
    'dgrid/Selection',
    'dojo/on',
    'dgrid/editor',
    'dgrid/List',
    'dgrid/tree',
    'dgrid/Keyboard',
    'dijit/form/HorizontalSlider',
    'dijit/form/NumberSpinner',
    'dgrid/OnDemandGrid',
    'dojo/store/Memory',
    'dojo/store/Observable',
    'dijit/form/FilteringSelect',
    'dojo/data/ObjectStore',
    'dijit/Dialog',
    'dojo/store/Cache',
    'dojo/store/JsonRest',
    'dojo/domReady!'
], function(parser, domConstruct, domStyle, declare, xhr,
            loader, Deferred,ItemFileWriteStore, QueryResults, Toolbar, Tree, TooltipDialog,
            StackContainer, ContentPane, Button,
            ForestStoreModel, Form, ValidationTextBox, DropDownButton, CheckBox,
            Uploader, UploaderIFramePlugin, OndemandGrid, Selection, on, editor,
            List, tree, Keyboard, Slider, NumberSpinner, Grid, Memory,
            Observable, FilteringSelect, ObjectStore, Dialog, Cache, JsonRest) {
    /* Declaration */
    filetypeStore = Observable(new Memory({
            idProperty: "pictype",
            labelProperty: "name",
            data: [
                { "pictype": "1", "name": "Paperpic" },
                { "pictype": "3", "name": "DVD" }
            ]
    }));
    filesubtypeStore = Observable(new Memory({
            idProperty: "picsubtype",
            labelProperty: "name",
            data: [
                { "picsubtype": "1", "pictype": "1", "name": "10x15" },
                { "picsubtype": "2", "pictype": "1", "name": "13x18" },
                { "picsubtype": "3", "pictype": "1", "name": "20x30" },
                { "picsubtype": "4", "pictype": "1", "name": "30x45" },
                { "picsubtype": "10", "pictype": "3", "name": "DVD" }
            ]
    }));
    var columns = [
        {
            label: 'Picture',
            field: 'filename',
            formatter: function(filename){
                return '<div class="icon" style="background-image:url(<?php echo Yii::app()->baseUrl ?>/images/client/thumbnails/' + filename + ');"><a class="iconlink" href="<?php echo Yii::app()->baseUrl ?>/images/client/' + filename + '">&nbsp;</a></div>';
            }
        },
        editor({
            label: 'Type of pic', autoSave: false, field: 'pictype',
                widgetArgs: {
                    store: filetypeStore, autoComplete: true, required: true, maxHeight: 150, style: "height: 20px; width: 120px;"
                },
            }, FilteringSelect),
        editor({
            label: 'Size of pic', autoSave: true, field: 'picsubtype',
                widgetArgs: {
                    store: filesubtypeStore, autoComplete: true, required: true, maxHeight: 150, style: "height: 20px; width: 120px;"
                },
            }, FilteringSelect),
        {
            label: 'Price/pcs',
            field: 'picprice',
            formatter: function(picprice){
                return '<span class="pic_price">' + picprice + '</span>';
            }
        },
        editor({
            label: 'Number of pics',
            autoSave: true,
            field: 'piccount',
            widgetArgs: {
                class: 'pic_count',
                style: 'width: 4em;',
                constraints: {
                    min:1,
                    max:100,
                    places:0
                }
            },
        }, NumberSpinner),
    ];
    /* Model */
    collectionId = <?php echo $colID; ?>;
    var userMemoryStore = Memory();
    var userJsonRestStore = JsonRest({idProperty: "id", target: "<?php echo $this->createUrl('/orderCollectionOrder/handleOrderedImages') ?>?id=" + collectionId + "&picid="});
    var imageStore = Cache(userJsonRestStore, userMemoryStore);
    window.grid = new (declare([editor, ObjectStore, OndemandGrid, Selection]))({
            store: imageStore,
            getBeforePut: false,
            columns: columns
    }, "imageList");
    parser.parse();
    grid.on(".dgrid-content .iconlink:click", function (evt) {
        evt.preventDefault();
        var data = dojo.getAttr(this, "href");
        var dlg = new Dialog({
            title: "Pic: " + data.substr(15),
            className:"dialogclass",
            content: '<img src="' + data + '">'
        });
        dlg.show();
    });
});
</script>
<?php $this->endDojoScript() ?>

因此,如果我更改第二个filteringselect,则put会正确触发。 萤火虫中put的内容:

{"id":"1","categoryId":"2","collectionId":"146","fileid":"20737","pictype":"3","picsubtype":"2","filename":"pic_143_resize.jpg","filetype":"DVD","filesubtype":"30x45","picprice":"2000","piccount":"2"}

响应:

{"id":"1","categoryId":"2","collectionId":"146","fileid":"20737","pictype":"3","picsubtype":"2","filename":"pic_143_resize.jpg","filetype":"DVD","filesubtype":"13x18","picprice":"300","piccount":"2"}

所以我得到了回复,但是dgrid没有得到更新...... 我还应该添加Observable商店吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

在这种情况下,这实际上归结为dojo/store/Observable中的逻辑。 Observable会响应put来电,执行以下两项操作之一:

  • 如果服务器请求解析为某个对象,则此对象将传递给notify(网格将接收)
  • 否则,最初传递给put的对象将传递到notify

你陷入了第一种情况,因为数组是对象 - 在这种情况下,正如你所怀疑的那样,你只需要对象本身,而不是数组。无论如何,数组没有多大意义,因为put对单个项目进行操作。