Enterprise open source portal built by and for the higher education community.
This project is maintained by uPortal-Project
Les mots clés “DOIT OBLIGATOIREMENT”, “NE DOIT SURTOUT PAS”, “OBLIGATOIRE”, “DOIT”, “NE DOIT PAS”, “DEVRAIT”, “NE DEVRAIT PAS”, “RECOMMANDÉ”, “POURRAIT”, et “FACULTATIF” dans ce document doivent être interprété comme décrit dans RFC 2119.
AngularJS est devenu un framework très populaire pour le développement côté client. En raison de la façon dont Angular interdit le “bootstrapping” imbriqué de modules, un soin particulier doit obligatoirement être requis pour s’assurer que plusieurs programmes Angular ne rentrent pas en conflit, ce qui dégraderait l’usage, indépendamment de la façon dont la skin ou les fragments de page sont combinés.
Ce document présente une stratégie dans laquelle uPortal et/ou des portlets peuvent utiliser Angular et coexister sans conflit.
Concrètement cela signifie que:
<!-- uportal-use-angular -->
, et s’il est trouvé, utilisez le service de $compile sur les noeuds DOM.$compile
pour compiler les nœuds DOM de toutes les portlets chargées.$controllerProvider.register
(avec un nom de contrôleur), $provide.service
, $provide.factory
, $provide.value
, et $compileProvider.directive
. Voir le code directement ci-dessous en exemple.angular.module('foo').config(function getLazyLoaders($compileProvider,
$controllerProvider, $provide) {
//Register controller helper
window.up.ngApp.controller = function(name, ctrl) {
$controllerProvider.register(name, ctrl);
return window.up.ngApp;
};
//Register $provide helpers
['service', 'factory', 'value'].forEach(function(t) {
window.up.ngApp[t] = function(name, thing) {
$provide[t](name, thing);
return window.up.ngApp;
};
});
//Register directive helper
window.up.ngApp.directive = function(name, dirFactory) {
$compileProvider.directive(name, dirFactory);
return window.up.ngApp;
};
fenêtre
global (window.angular
)<!-- uportal-use-angular -->
comme indicateur au portail de ne pas compiler (avec $compile) tout le contenu de toutes les portlets.window.Angular === undefined
, or typeof Angular === 'undefined'
) les portlets DOIVENT chercher le lazy-loader window.up.ngApp et, s’il est trouvé, utiliser the lazy-loader pour enregistrer ses composants.$(window).load
pour le faire.window.up.ngBootstrap
pour enregistrer leur fonctions d’amorçage.bootstrap
qui prendra en paramètre une instance d’id comme une chaîne string
.up.ngApp
et les utiliser pour s’enregistrer si ils sont disponibles.$(window).load
, et alors après seulement appeler la dite function d’amorçage en lui passant son instance d’id.<%@ page contentType="text/html" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0" %>
<portlet:defineObjects/>
<c:set var="nc"><portlet:namespace/></c:set>
<c:set var="lc" value="${fn:toLowerCase(nc)}" />
<c:set var="n" value="${fn:replace(lc, '_', '')}"/>
<script type="text/javascript">
(function(window, $) {
if (typeof window.Angular === 'undefined') {
//No matter what, check Angular and load if needed.
var Angular_SCRIPT_ID = 'Angular-uportal-script';
var scr = document.getElementById(Angular_SCRIPT_ID);
if (!scr) {
scr = document.createElement('script');
scr.type = 'text/javascript';
scr.id = Angular_SCRIPT_ID;
scr.async = true;
scr.charset = 'utf-8';
scr.src = 'https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.4/angular.js';
document.body.appendChild(scr);
}
//Working inline, so call our bootstrap function.
$(window).load(bootstrap);
} else {
if (window.up.ngApp) {
register(window.up.ngApp);
} else {
bootstrap();
}
}
function bootstrap() {
var app = angular.module('${n}-test2', []);
register(app);
angular.bootstrap(document.getElementById('${n}-test2'), ['${n}-test2']);
}
function register(app) {
app.controller('test2Controller', function($scope) {
$scope.awesomeThings = ['AngularJS', 'Bower', 'Grunt', 'Yeoman', 'uPortal', 'Open Source!'];
});
}
})(window, up.jQuery);
</script>
<style>
#${n}-test2[ng-cloak] {
display: none;
}
</style>
<div id="${n}-test2" ng-cloak ng-controller="test2Controller">
<h1>Awesome Things</h1>
<ul>
<li ng-repeat="thing in awesomeThings"> . </li>
</ul>
</div>
<%@ page contentType="text/html" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0" %>
<portlet:defineObjects/>
<c:set var="nc"><portlet:namespace/></c:set>
<c:set var="lc" value="${fn:toLowerCase(nc)}" />
<c:set var="n" value="${fn:replace(lc, '_', '')}"/>
<script type="text/javascript" src="/jasig-widget-portlets/test/scripts/module.js"></script>
<script type="text/javascript">
(function(window, $) {
if (typeof window.Angular === 'undefined') {
//No matter what, check Angular and load if needed.
var Angular_SCRIPT_ID = 'Angular-uportal-script';
var scr = document.getElementById(Angular_SCRIPT_ID);
if (!scr) {
scr = document.createElement('script');
scr.type = 'text/javascript';
scr.id = Angular_SCRIPT_ID;
scr.async = true;
scr.charset = 'utf-8';
scr.src = 'https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.4/angular.js';
document.body.appendChild(scr);
}
}
$(window).load(function() {
if ( up.ngBootstrap ) {
//Once the needed scripts ready, bootstrap if needed.
up.ngBootstrap.test('${n}');
}
});
})(window, up.jQuery);
</script>
<style>
#${n}-test[ng-cloak] {
display: none;
}
</style>
<div id="${n}-test" ng-cloak ng-controller="testController">
<h1>Awesome Things</h1>
<ul>
<li ng-repeat="thing in awesomeThings"> . </li>
</ul>
</div>
(function(window, _) {
'use strict';
if (window.up.ngApp) {
//If loaded, register right away.
register(window.up.ngApp);
} else {
//Otherwise, let jsp call your bootstrapper once Angular is loaded.
window.up = window.up || {};
window.up.ngBootstrap = window.up.ngBootstrap || {};
window.up.ngBootstrap.test = function(n) {
var app = angular.module(n + '-test', []);
register(app);
var bootEle = document.getElementById(n + '-test');
angular.bootstrap(bootEle, [n + '-test']);
}
}
function register(app) {
app.controller('testController', function($scope) {
$scope.awesomeThings = ['AngularJS', 'Bower', 'Grunt', 'Yeoman', 'uPortal', 'Open Source!'];
});
}
})(window, up.underscore);