0

在带有导航栏的外壳中,我必须调用 javascript 函数(外部模块),但只有在组合完成时才能调用。

这是我的代码:

外壳.js

define(['plugins/router', 'durandal/app', 'charms'], function (router, app, ch) {
  return {
    router: router,
    activate: function () {
        router.map([
            { route: '', title:'Welcome', moduleId: 'viewmodels/welcome', nav: true },
            { route: 'Gallery', moduleId: 'viewmodels/gallery', nav: true }
        ]).buildNavigationModel();

        return router.activate();
    }
  };
});

我试图使用附加/组合完成回调,但模块总是在之前调用。

有任何想法吗?谢谢

4

2 回答 2

1

除了布雷特的回答。如果 charms 是一个有效的 AMD 模块,但它在加载时会立即执行,而不应将其声明为依赖项。而是require在需要时使用。为此,将 require 语法更改为 commonjs 样式http://requirejs.org/docs/whyamd.html#sugar

define(function (require) {
  var router = require('plugins/router'),
      app = require('durandal/app')        

  return {
    router: router,
    activate: function () {
        router.map([
            { route: '', title:'Welcome', moduleId: 'viewmodels/welcome', nav: true },
            { route: 'Gallery', moduleId: 'viewmodels/gallery', nav: true }
        ]).buildNavigationModel();

        return router.activate();
    },
    attached: function(){ // or compositionComplete whatever suits better
        require('charms');
    }
  };
}); 

请注意根据您上面的描述,这charms会在加载时立即执行,但 AMD 模块仅在应用程序的生命周期内评估一次。因此,您可能希望从 中返回类似 ainitrun函数的charms内容,以便可以多次执行。

假设的魅力

define(function (require) {
  function init(){
      //do whatever charms is doing
  }

  return {
    init: init
  };
}); 

这样您就不必切换到 commonjs 样式,只需调用

attached: function(){ // or compositionComplete
    ch.init()
}
于 2013-11-06T20:45:47.380 回答
0

首先,您没有为返回的视图模型提供compositionComplete()or方法。attached()Durandal 在您的视图模型上执行这些函数(如果存在)。你可以在这里阅读:http: //durandaljs.com/documentation/Hooking-Lifecycle-Callbacks/。因此,添加它们,如下所示:

define(['plugins/router', 'durandal/app', 'charms'], function (router, app, ch) {
  return {
    router: router,
    activate: function () {
        // this is called when the shell module is activated (always called FIRST)
        router.map([
            { route: '', title:'Welcome', moduleId: 'viewmodels/welcome', nav: true },
            { route: 'Gallery', moduleId: 'viewmodels/gallery', nav: true }
        ]).buildNavigationModel();

        return router.activate();
    },
    attached: function() {
        // this is called when the shell view is attached to the DOM
    },
    compositionComplete: function () {
        // this is called when the shell view composition is complete
    }
  };
});

如果'charms'模块中的代码在任何激活器方法之前执行,可能是因为它不是以与 RequireJS 一起使用的模块化模式编写的。您必须使用 a 包装模块define()才能按预期工作。

于 2013-11-06T19:50:10.797 回答