Durandal,获取当前模块的路径

时间:2013-07-10 20:10:53

标签: durandal

Durandal有办法获得当前模块的路径吗?我正在SPA中构建一个仪表板,并希望以与durandal对“FolderWidgetName”相同的方式组织我的小部件,该文件夹将包含controller.js和view.html文件。我尝试在我的controller.js文件中使用getView()方法但是永远不能让它在视图的当前文件夹中查找。

getView(){  
    return "view"; // looks in the "App" folder  
    return "./view"; // looks in the "App/durandal" folder  
    return "/view"; // looks in the root of the website   
    return "dashboard/widgets/htmlviewer/view" //don't want to hard code the path  
} 
  • 我不想硬编码控制器内部的路径
  • 我不想覆盖viewlocator,因为应用程序的其余部分仍然可以作为使用标准约定的常规durandal spa。

3 个答案:

答案 0 :(得分:1)

您可以使用define(['module'], function(module) { ...来暂停当前模块。 getView()将允许您设置特定视图,或者,如下例所示,在多个视图之间动态切换。

define(['module'], function(module) {

  var roles = ['default', 'role1', 'role2'];
  var role = ko.observable('default');
  var modulePath = module.id.substr(0, module.id.lastIndexOf('/') +1);

  var getView = ko.computed(function(){
        var roleViewMap = {
          'default': modulePath + 'index.html',
          role1: modulePath + 'role1.html',
          role2: modulePath + 'role2.html'
        };

        this.role = (role() || 'default');

        return roleViewMap[this.role];
  });


  return {
    showCodeUrl: true,
    roles: roles,
    role: role,
    getView: getView,
    propertyOne: 'This is a databound property from the root context.',
    propertyTwo: 'This property demonstrates that binding contexts flow through composed views.',
    moduleJSON: ko.toJSON(module)
  };


});

这是一个实例http://dfiddle.github.io/dFiddle-1.2/#/view-composition/getView

答案 1 :(得分:0)

在viewmodel中添加激活功能,如下所示:

define([],
    function() {
        var vm = {
            //#region Initialization
            activate: activate,
            //#endregion
        };

    return vm;

    //#region Internal methods
    function activate(context) {
        var moduleId = context.routeInfo.moduleId;
        var hash = context.routeInfo.hash;
    }
    //#endregion
});

答案 2 :(得分:0)

您可以简单地将您的设置视图绑定到router.activeRoute.name或.url,这应该可以满足您的需求。如果您在加载时尝试写回setup viewmodels属性,则可以执行以下操作。

如果您正在使用显示模块,则需要定义功能并创建模块定义列表并将其返回。示例:

define(['durandal/plugins/router', 'view models/setup'],
    function(router, setup) {

var myObservable = ko.observable();

function activate() {
    setup.currentViewName = router.activeRoute.name;
    return refreshData();
}

var refreshData = function () {
    myDataService.getSomeData(myObservable);
};

var viewModel = {
    activate: activate,
    deactivate: deactivate,
    canDeactivate: canDeactivate
};

return viewModel;
});

您还可以直接揭示文字,可观察信息甚至函数 -

    title: ko.observable(true),
    desc: "hey!",
    canDeactivate: function() { if (title) ? true : false,

查看durandal的路由器页面,了解有关可用内容的更多信息。此外,Durandal 2.0正在开启路由器。

http://durandaljs.com/documentation/Router/