2

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

主要型号:

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中发布了这个问题

谢谢

4

1 回答 1

2

检查 requierejs 文档以获取循环依赖项http://requirejs.org/docs/api.html#circular

循环依赖很少见,通常表明您可能想要重新考虑设计。但是,有时需要它们,在这种情况下,请使用上面指定的 require()。

对于 main.js 添加 require 作为依赖项,然后显式地 requiremodels/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');
            }
            //...
        };
    }
);
于 2013-07-19T10:16:14.027 回答