我有两个相互交叉引用的模型。可能看起来像这样:
主要型号:
define(
[ 'durandal/app', 'durandal/plugins/router', 'models/Shell', 'models/EditModel' ],
function (app, router, shell, editModel) {
//...
return {
//...
// This function should be accessible by the EditModel
update: function() {
//...
},
showEditView: function() {
// Initialise the EditModel with some data and show the according view afterwards
editModel.init('set some important stuff here...');
router.navigateTo('#/EditView');
}
//...
};
}
);
编辑模型:
define(
[ 'durandal/app', 'durandal/plugins/router', 'models/Shell', 'models/MainModel' ],
function (app, router, shell, mainModel) {
//...
return {
//...
// This function should be accessible by the MainModel
init: function() {
//...
},
showMainView: function() {
// Update the the MainModel with some data and show the according view afterwards
mainModel.update('set new data here...');
router.navigateTo('#/MainView');
}
//...
};
}
);
不幸的是,这不起作用。如果将页面加载到MainView上并调用showEditView,则变量editView是已知的,并且一切正常,但是EditModel中的变量mainModel是未定义的,因此调用
mainModel.update(...)
失败。如果将页面加载到EditView上但朝着“相反的方向”(发生于EditModel中的var mainModel,但是未定义MainModel中的editModel),也会发生相同的事情。
这是一个已知问题吗?如果是这样:我如何规避它?
我也在Durandals Google Group中发布了此问题
谢谢
最佳答案
查看requierejs文档以获取循环依赖http://requirejs.org/docs/api.html#circular。
循环依赖很少见,通常是您可能想要的标志
重新思考设计。但是,有时需要它们,因此
情况下,请使用上面指定的require()。
对于main.js,添加require作为依赖项,然后显式要求models/EditModel
应该可以解决问题。复制其他模块的内容或rethink the design
;-)。
define(
[ 'require', 'durandal/app', 'durandal/plugins/router', 'models/Shell', 'models/EditModel' ],
function (require, app, router, shell, editModel) {
//...
return {
//...
// This function should be accessible by the EditModel
update: function() {
//...
},
showEditView: function() {
// Initialise the EditModel with some data and show the according view afterwards
require('models/EditModel').init('set some important stuff here...');
router.navigateTo('#/EditView');
}
//...
};
}
);