如何重新映射Durandal视图模型

时间:2014-03-31 06:53:05

标签: durandal

这是我在Durandal项目中的main.js文件。

我尝试做的是设置名称' upload-item'解析为' upload-item'或者' upload-item-prehtml5'取决于是否定义了File

requirejs.config({
  paths: {
    'text': '../lib/require/text',
    'durandal': '../lib/durandal/js',
    'plugins': '../lib/durandal/js/plugins',
    'transitions': '../lib/durandal/js/transitions',
    'knockout': '../lib/knockout/knockout-2.3.0',
    'bootstrap': '../lib/bootstrap/js/bootstrap',
    'jquery': '../lib/jquery/jquery-1.9.1.min',
    'jquery-ui': '../lib/jquery-ui/jquery-ui-1.10.4.custom/js/jquery-ui-1.10.4.custom.min',
    'moment': '../lib/moment/moment',
    'knockout-jqueryui': '../lib/knockout/knockout-jqueryui.min',
    'file-size-formatting': '../lib/wone/file-size-formatting'
  },
  shim: {
    'bootstrap': {
      deps: ['jquery'],
      exports: 'jQuery'
    }
  }
});

define(['durandal/system', 'durandal/app', 'durandal/viewLocator'], function (system, app, viewLocator) {
  //>>excludeStart("build", true);
  system.debug(true);
  //>>excludeEnd("build");

  var filetype = typeof(File);
  if (filetype == 'undefined') {
    //apply pre-html5 fixups
    require.config({
      map: {
        '*': {
          'upload-item': 'upload-item-prehtml5'
        }
      }
    });
  }

  app.title = 'Jumbo File Transfer';

  //specify which plugins to install and their configuration
  app.configurePlugins({
    router: true,
    dialog: true,
    widget: {
      kinds: ['expander']
    }
  });

  app.start().then(function () {
    //Replace 'viewmodels' in the moduleId with 'views' to locate the view.
    //Look for partial views in a 'views' folder in the root.
    viewLocator.useConvention();

    //Show the app by setting the root view model for our application.
    app.setRoot('shell');
  });
});

在IE8上进行测试表明发生了对require.config的调用并添加了映射,但它似乎没有达到预期的效果:upload-item.js和upload-item.html在加载时加载我预计要加载upload-item-prehtml5.js和upload-item-prehtml5.html。

如果这是错误的方法,那么执行这种条件解决方法的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

它不是完全我最初想要的东西,但我发现你可以这样做:

var prehtml5 = (typeof (File) == 'undefined');

requirejs.config({
  paths: {
    ...
    'upload-item': prehtml5 ? 'upload-item-prehtml5' : 'upload-item'
  },
  shim: {
    'bootstrap': {
      deps: ['jquery'],
      exports: 'jQuery'
    }
  }
});

路径重新映射似乎扩展到文件名中。通常你不会列出main.js的兄弟姐妹,但你可以,如果你这样做,你可以重新映射它们,包括文件名。