0

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  
} 
  • 我不想硬编码控制器内部的路径
  • 我不想覆盖视图定位器,因为该应用程序的其余部分仍然充当使用标准约定的常规 durandal 水疗中心。
4

3 回答 3

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

于 2013-07-12T07:25:15.837 回答
0

向您的视图模型添加激活功能,如下所示:

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
});
于 2013-07-10T21:58:35.960 回答
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/

于 2013-07-11T09:55:02.820 回答