Durandal:无需重新加载模型即可切换视图

时间:2013-12-11 12:18:49

标签: durandal

我正在使用duraldal v2,并且在其中一个页面上我想切换视图而不重新激活模型。

为实现这一目标,我使用 compose 绑定从v1开始使用连接到observable的 view ,在我的导航链接中通过内联点击绑定进行更改:

    <ul class="nav nav-tabs">
        <li data-bind="css: {active:activeView() == 'view1'}"><a href="#" data-bind="click: function(){setView('view1')}">View 1</a></li>
        <li data-bind="css: {active:activeView() == 'view2'}"><a href="#" data-bind="click: function(){setView('view2')}">View 2</a></li>
        . . .
    </ul>
    <div data-bind="compose: {view: activeView, activate: true, area: 'settings', transition: 'entrance', cacheViews: true}"></div>

VM:

define(['knockout'], function (ko) {
return {
    activeView: ko.observable()
    ,setView: function(view) {
        this.activeView(view);
    }
    ,activate: function (args) {
        var self = this;
        return system.defer(function(dfd) {
            self.setView('view1');
            dfd.resolve(true);
        }).promise();
    }
    . . . 

我相信这是一种尴尬的方式,在v2中应该有更优雅的方式来做到这一点。据我所知,我不能像在ko样本中那样使用子路由器,因为它每次都会重新加载模型。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

对我来说很好看。

你不喜欢内联函数吗?你可以这么做:

    <ul class="nav nav-tabs">
        <li data-bind="css: {active:activeView() == 'view1'}"><a href="#" data-bind="click: setView1">View 1</a></li>
        <li data-bind="css: {active:activeView() == 'view2'}"><a href="#" data-bind="click: setView2">View 2</a></li>
        . . .
    </ul>

和:

return {
    activeView: ko.observable()
    ,setView1: function() { this.activeView('view1') },
    ,setView2: function() { this.activeView('view2') },
...

如果此功能对您来说非常普遍,您可以考虑将其转换为可能会像这样填充模式的小部件。