I believe that you could just reuse Ionic CSS (like with Bootstrap, for example) to get a style for mobile devices, and then connect some binding know-how so that it responds to user actions.
A simple example: imagine you want to create a tabbed interface (I took the markup from docs )
<div class="tabs-striped tabs-top tabs-background-positive tabs-color-light"> <div class="tabs"> <a class="tab-item active" href="#"> <i class="icon ion-home"></i> Test </a> <a class="tab-item" href="#"> <i class="icon ion-star"></i> Favorites </a> <a class="tab-item" href="#"> <i class="icon ion-gear-a"></i> Settings </a> </div> </div>
With ionic you should use ionic tabs , but with durandal / KO you have compose and views:
<div class="tabs-striped tabs-top tabs-background-positive tabs-color-light" data-bind="delegatedHandler: 'click'"> <div class="tabs" data-bind="foreach: tabs"> <a class="tab-item" href="#" data-bind="delegatedClick: $parent.setView.bind($parent), css: {active: isActive}"> <i class="icon" data-bind="css: icon"></i> <span data-bind="text: title"></span> </a> </div> </div> <div data-bind="compose: {view: activeView, cacheViews: true}"></div>
And then add doling to your vm:
return { tabs: [ {title:'Test', view: 'test.html', icon: 'ion-home', isActive: ko.observable(false)}, {title:'Favourites', view: 'favs.html', icon: 'ion-star', isActive: ko.observable(false)}, ... ], ,activeView: ko.observable(), ,setView: function(view) { this.activeView(view.view || view); this.tabs.forEach(function(v){ v.isActive(v.view === viewName); }); } }
This is just to give you an idea of a possible approach. In the end, angular and KO are very similar ... And most of the ionic components of JS are already implemented in the durandal (for example, navigation closely resembles routing and composition).