在模型更改时刷新 Dojo MVC 组不适用于复杂对象

Refreshing Dojo MVC Groups on model change doesn't work for complex objects

本文关键字:不适用 适用于 复杂 对象 MVC Dojo 模型 刷新      更新时间:2023-09-26

如下所示,我有一个返回复杂对象的虚拟内存存储。我想将这个复杂的对象绑定到表单上。因为它是一个复杂的对象,所以我通过两个 MVC 组绑定该对象。刷新模型时(通过"获取"按钮)时出现问题。外部 MVC 组已刷新,但内部 MVC 组未刷新。仅当我手动重置内部 MVC 组的 target 属性时,它才有效:

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

还有其他更好的方法吗?

<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>

我可以说的几件事是:

    一般来说,你需要使用 dojox/mvc/
  • at 来让小部件对模型的变化做出反应。 dojox/mvc/Group 也不例外。
  • Dojo 不允许您将两个data-dojo-type放在一个元素上。您可能需要考虑data-dojo-mixins
  • 要创建嵌套对象的数据模型,您需要使用 dojox/mvc/getStateful。 dojox/mvc/
  • StatefulModel 自 1.8 版本起已被 dojox/mvc/getStateful 和 dojox/mvc/StoreRefController 取代。

下面是类似用例的示例代码:

<!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>

希望这有帮助。

最佳, - 阿基拉