Dojo Update MVC Model Change Teams Not Working for Complex Objects

As shown below, I have a dummy memory that returns a complex object. I would like to bind this complex object to a form. Since this is a complex object, I am linking the object through two MVC groups. The problem occurs when the model is updated (via the "Fetch" button). The outer MVC group is updated, but the inner one is not. It only works if I manually reset the target

MVC internal group property :

dijit.byId('sub-group').set('target', model.prop7);

      

Is there another better way to do this?

<script type="text/javascript">
    // Create dummy store
    var store;
    require(['dojo/store/Memory'], function(Memory) {
        store = new Memory({
            data: [{
                id: 1,
                prop1: 'prop 1 value',
                prop2: 'WA',
                prop7: {
                    prop8: 'prop 4 value',
                    prop9: 'prop 5 value'
                }
            }]
        });
    });

    // Create model for MVC
    var model;
    require([
        'dojo/dom',
        "dojo/parser",
        "dojo/Stateful",
        "dojo/domReady!"
    ], function (dom, parser, Stateful) {
        model = new Stateful();
    });

</script>

<button data-dojo-type="dijit/form/Button" data-dojo-props="iconClass: 'dijitIconDatabase'">
    <script type="dojo/on" data-dojo-event="click">
        var data = store.get(1);

        model.set(data);

        //dijit.byId('sub-group').set('target', model.prop7);
    </script>

    Fetch
</button>


<form data-dojo-type="dijit/form/Form" id="form" data-dojo-type="dojox/mvc/Group" data-dojo-props="target: model">
    <script type="dojo/require">at: "dojox/mvc/at"</script>

    <div class="row">
        <label for="text">Text:</label>
        <input id="text" data-dojo-type="dijit/form/ValidationTextBox" required="true" data-dojo-props="value: at('rel:', 'prop1')"/>
    </div>

    <div class="row" id="sub-group" data-dojo-type="dojox/mvc/Group" data-dojo-props="target: model.prop7">
        <label for="text2">Text 2:</label>
        <input id="text2" data-dojo-type="dijit/form/ValidationTextBox" required="true" data-dojo-props="value: at('rel:', 'prop8')"/>
    </div>
</form>

      

+3


source to share


1 answer


A few things I can say:

Here's some sample code for a similar use case:



<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/dojo/1.10.1/dojo/resources/dojo.css" />
        <link id="themeStyles" rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/dojo/1.10.1/dijit/themes/claro/claro.css" />
        <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/dojo/1.10.1/dojo/dojo.js" data-dojo-config="parseOnLoad: 0, async: 1"></script>
        <script type="text/javascript">
            require([
                "dojo/parser",
                "dojo/store/Memory",
                "dojox/mvc/getStateful"
            ], function(parser, Memory, getStateful){
                model = getStateful({});
                store = new Memory({
                    data: [{
                        id: "mydata",
                        prop1stLevel: "Value of 1st level property",
                        group2ndLevel: {
                            prop2ndLevel: "Value of 2nd level property"
                        }
                    }]
                });
                parser.parse();
            });
        </script>
    </head>
    <body class="claro">
        <script type="dojo/require">at: "dojox/mvc/at"</script>
        <button data-dojo-type="dijit/form/Button" data-dojo-props="iconClass: 'dijitIconDatabase'">
            <script type="dojo/on" data-dojo-event="click">
                require(["dojox/mvc/getStateful"], function(getStateful){
                    model.set("group1stLevel", getStateful(store.get("mydata")));
                });
            </script>
            Fetch
        </button>
        <form id="form" data-dojo-type="dijit/form/Form" data-dojo-mixins="dojox/mvc/Group" data-dojo-props="target: at(model, 'group1stLevel')">
            <div class="row">
                <label for="1st-level">1st level:</label>
                <input id="1st-level" data-dojo-type="dijit/form/ValidationTextBox" required="true" data-dojo-props="value: at('rel:', 'prop1stLevel')"/>
            </div>
            <div class="row" id="sub-group" data-dojo-type="dojox/mvc/Group" data-dojo-props="target: at('rel:', 'group2ndLevel')">
                <label for="2nd-level">2nd level:</label>
                <input id="2nd-level" data-dojo-type="dijit/form/ValidationTextBox" required="true" data-dojo-props="value: at('rel:', 'prop2ndLevel')"/>
            </div>
        </form>
    </body>
</html>

      

Hope it helps.

Best - Akira

+5


source







All Articles