我有两个相互交叉引用的模型。可能看起来像这样:

主要型号:

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');
            }
            //...
        };
    }
);

09-18 18:37