在模型更改时刷新 Dojo MVC 组不适用于复杂对象
Refreshing Dojo MVC Groups on model change doesn't work for complex objects
如下所示,我有一个返回复杂对象的虚拟内存存储。我想将这个复杂的对象绑定到表单上。因为它是一个复杂的对象,所以我通过两个 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>
希望这有帮助。
最佳, - 阿基拉
相关文章:
- html5 drawImage适用于firefox,而不是chrome
- Jquery Ajax POST不工作.适用于GET
- 如何调试遗留的javascript代码(适用于IE,但在Google Chrome中不正常)
- .load()适用于window,而不是ID
- 使用Jquery更改css样式适用于id's、 不在课堂上
- 提交按钮不会;不适用于Chrome或Firefox,但适用于Internet Explorer
- 为什么 javascript 中的“btoa”编码适用于 20 位字符串而不是 20 位整数
- Javascript String to Date适用于Chrome,而不是FF或Safari
- Onchange,向上,向下箭头键适用于FF和Chrome,但在IE中不起作用
- .load() 适用于 IE 和 dreamweaver 预览版,但不能使用 opera 和 chrome
- 找不到适用于 Highcharts 的 JSON 数组语法
- 为什么在jQuery中使用focusout适用于Firefox,而使用addEventListener则不适用;t
- jQuery选择菜单验证器适用于FF和Chrome,但不适用IE
- 单选按钮'onclick'适用于Chrome和Firefox,但不适用IE
- JQuery ScrollTop适用于chrome,但不适用firefox
- window.opener.location.href适用于IE,但不适用Chrome或Safari
- Frame Busting buster不完全适用于IE
- Jquery touch punch适用于Chrome和Firefox,但不适用IE
- 背景更改仅适用于chrome+$.预加载不适用;不起作用
- JavaScript window.location.replace适用于Firefox,但不适用IE或Chrome