Last active
August 29, 2015 14:10
-
-
Save bripkens/c5bd3ae29ee04451f04c to your computer and use it in GitHub Desktop.
A quick test how to use the Angular UI router without controllers. Would need to remove resolvers as well, no?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
angular.module('scheduler.conferences', ['ui.router', 'expose-to-scope']) | |
.config(function($stateProvider) { | |
$stateProvider | |
.state('conferences', { | |
url: '/conferences', | |
directive: 'conferenceList', | |
resolve: { | |
conferences: function(ConferenceService) { | |
return ConferenceService.getConferences(); | |
} | |
} | |
}); | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function(angular) { | |
'use strict'; | |
angular.module('expose-to-scope', ['ui.router']) | |
.config(function($stateProvider, $injector) { | |
$stateProvider.decorator('views', function(state, parent) { | |
var views = parent(state); | |
Object.keys(views).forEach(function(viewName) { | |
var view = views[viewName]; | |
if (view.resolve && !view.controller) { | |
view.controller = buildExposingController(view.resolve); | |
if (view.directive) { | |
var deps = Object.keys(view.resolve); | |
view.template = createTemplate(view.directive, deps); | |
} | |
} | |
}); | |
return views; | |
}); | |
}); | |
function buildExposingController(resolve) { | |
var deps = Object.keys(resolve); | |
deps.unshift('$scope'); | |
var ctrl = function($scope) { | |
$scope.resolve = {}; | |
for (var i = 1; i < deps.length; i++) { | |
var dep = deps[i]; | |
$scope.resolve[dep] = arguments[i]; | |
} | |
}; | |
ctrl.$inject = deps; | |
return ctrl; | |
} | |
function createTemplate(name, deps) { | |
var directiveName = toSpinalCase(name); | |
var template = '<' + directiveName; | |
template += deps.reduce(function(acc, dep) { | |
return acc + ' ' + dep + '="resolve.' + dep + '"'; | |
}, ''); | |
return template + '></' + directiveName + '>'; | |
} | |
function toSpinalCase(camelCaseName) { | |
return camelCaseName.replace(/[A-Z]/g, function(letter, pos) { | |
return (pos ? '-' : '') + letter.toLowerCase(); | |
}); | |
} | |
})(angular); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment