<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Beiträge von Desiree Zottl - Mobile USTP MKL</title>
	<atom:link href="https://mobile.fhstp.ac.at/author/dm131533/feed/" rel="self" type="application/rss+xml" />
	<link>https://mobile.fhstp.ac.at/author/dm131533/</link>
	<description>Die &#34;Mobile Forschungsgruppe&#34; der USTP, sie  sammelt hier alles zu den Themen Design, UX und Entwicklung mobiler Applikationen</description>
	<lastBuildDate>Sun, 04 Jan 2015 16:18:04 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://mobile.fhstp.ac.at/wp-content/uploads/2025/03/icon-120x120.webp</url>
	<title>Beiträge von Desiree Zottl - Mobile USTP MKL</title>
	<link>https://mobile.fhstp.ac.at/author/dm131533/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Hybrid Apps mit Ionic erstellen</title>
		<link>https://mobile.fhstp.ac.at/allgemein/hybrid-apps-mit-ionic-erstellen/</link>
		
		<dc:creator><![CDATA[Desiree Zottl]]></dc:creator>
		<pubDate>Sun, 04 Jan 2015 16:18:04 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[hybrid Apps]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=5047</guid>

					<description><![CDATA[<p>Wer beim Entwickeln seiner nächsten App auf Web Technologien setzt, um diese dann mittels Cordova oder Intel SDK in hybrid Apps für verschiedene Plattformen zu verwandeln, sollte sich das Front-End SDK Ionic ansehen. Das open source Projekt ist eine Kombination aus CSS Framework und JavaScript UI Library. Es  beinhaltet mobile UI Komponenten, um ein natives Look-and-Feel mit <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/hybrid-apps-mit-ionic-erstellen/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/hybrid-apps-mit-ionic-erstellen/">Hybrid Apps mit Ionic erstellen</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Wer beim Entwickeln seiner nächsten App auf Web Technologien setzt, um diese dann mittels Cordova oder Intel SDK in hybrid Apps für verschiedene Plattformen zu verwandeln, sollte sich das Front-End SDK Ionic ansehen.</p>
<p>Das open source Projekt ist eine Kombination aus CSS Framework und JavaScript UI Library. Es  beinhaltet mobile UI Komponenten, um ein natives Look-and-Feel mit HTML5 und CSS zu erreichen. Für die JavaScript Funktionalitäten verwendet Ionic Angular.js als MVC Framework.</p>
<p><span id="more-5047"></span></p>
<h2>CSS Komponenten</h2>
<p>Alle Stylesheets die Ionic mitliefert sind in Sass geschrieben und übersichtlich strukturiert. Durch die Verwendung von Variablen ist es einfach das default Styling an das eigene Design anzupassen. Standardmäßig sind alle Komponenten im iOS Style gehalten. Die Verwendung der fertigen Ionic CSS Klassen hat den Vorteil schnell und einfach ein natives Aussehen der App zu erreichen. Alle üblichen Höhen, Breiten, Schatten, Abrundungen etc. sind bereits definiert, wodurch sich der Entwickler viel Arbeit spart die Komponenten selbst nachzubasteln.</p>
<p>Die fertig gestylten HTML5 Komponenten umfassen:</p>
<ul>
<li>Buttons</li>
<li>Listen</li>
<li>Formulare</li>
<li>Checkboxen</li>
<li>Checkboxen im iOS Switch Style</li>
<li>Slider</li>
<li>Selektboxen</li>
</ul>
<p>Zusätzlich liefert das Framework Icons und ein fertiges Grid System.</p>
<h2>JS Komponenten</h2>
<p>Doch nicht nur statische Komponenten stellt Ionic zur Verfügung. Bei den JS Steuerelementen wird dem Entwickler vor allem die Schwierigkeit abgenommen, ein natives Look-and-Feel zu kreieren. Denn nicht nur das typische Aussehen, auch das Verhalten der Komponenten und deren Effekte ist wichtig, um die vom Benutzer durch andere Apps gewohnte Usability zu erreichen.</p>
<p>Werden die mitgelieferten Elemente richtig verwendet, ergibt sich dieses Verhalten automatisch. Ein gutes Beispiel dafür ist die Navigationsbar. Das Routing wird in Ionic über so genannte States realisiert. Diese verweisen auf verschiedene Views und stellen das Pendant zu verschiedenen View Controllern im nativen Development dar. Die Definition der States geschieht im Angular Routing Stil:</p>
<pre class="brush: jscript; title: ; notranslate">
.state 'mainView',
  url: &quot;/&quot;
  templateUrl: &quot;js/states/mainView.html&quot;
</pre>
<p>Das Template mainView.html wird also beim Aufruf der root Url so wie beim JS Aufruf des mainView States gerendert.<br />
Wer bereits mit Angular.js vertraut ist kennt das Konzept zu einer View gehörige Controller einfach im Template im Attribut ng-controller anzugeben. Alternativ könnte dieser auch bereits bei der Statedefinition angegeben werden.</p>
<p>Während diese Templates in Angular üblicherweise in ein &lt;ng-view&gt; Element gerendert werden, liefert Ionic ein custom Element namens &lt;ion-nav-view&gt;. Darin wird dann das entsprechende &lt;ion-view&gt; Element je nach State dargestellt (jedes Template das eine View repräsentiert sollte in ein &lt;ion-view&gt; Element gewrapped sein). Hält man sich an diese Ver­schach­te­lung wird automatisch eine Navigationbar erstellt welche Zurück-Button und Titel automatisch richtig setzt.  Das Verhalten eines nativen Navigation Controllers wird genau nachgestellt, inklusive üblichen Slide-Effekt zur nächsten View, wenn sich der State ändert.</p>
<p>Weitere praktische JavaScript Komponenten werden in der <a href="http://ionicframework.com/docs/api/">Doku</a> genau beschrieben.</p>
<p>Durch die Verwendung von Angular.js können auch alle praktischen Möglichkeiten die das Framework bietet verwendet werden. Two-way data binding, Filter, eigene Factories und viele zeitsparende Direktiven wie ng-repeat sind für die Entwicklung der Webapplikation vorhanden.</p>
<h2>Probleme in der Praxis</h2>
<p>Abgesehen von den Problemen die bei der Verwandlung von Webapps in hybrid Apps generell bestehen (vor allem Unterschiede in den verschiedenen Plattformen), gibt es ein paar Schwierigkeiten die beim Entwickeln des Webteils mit Ionic auftreten können:</p>
<ul>
<li><strong>Datenaustausch zwischen States<br />
</strong>Es gibt mehrere Möglichkeiten Daten zwischen verschiedenen States auszutauschen. Über die URL können Parameter übergeben werden oder die Daten können in eine Variable in einem übergeordneten Scope gespeichert werden. Handelt es sich bei den Controllern die Daten austauschen möchten um Parent- und Childcontroller, kann über Funktionen wie emit() und broadcast() eine Nachricht geschickt werden auf die der jeweils andere Controller hören kann. Eine weitere Möglichkeit wäre die Daten in den Local Storage abzulegen, wodurch beliebig viele Komponenten darauf Zugriff hätten. Für das einfache Weitergeben von temporären Daten erscheinen alle diese Möglichkeiten unzufriedenstellend.</li>
<li><strong>History<br />
</strong>Nicht immer ist der Aufbau einer App so standardmäßig, dass die Navigationsbar den Zurück-Button immer zur richtigen Zeit anzeigt bzw nicht anzeigt. Das Vorhandensein des Buttons kann manuell eingestellt werden. Gibt es nun mehrere Möglichkeiten um auf den gleichen State zu gelangen und möchte man in einem Fall keinen Zurück-Button (da man beispielsweise vom Flyoutmenü kommt) und in einem anderen Fall doch (da man von einem anderen State zur View gelangt an den ein Zurückgelangen durchaus Sinn macht), muss diese View den Button manuell ein- und ausblenden abhängig vom vorhergehenden State. Sollche Sonderfälle können zwar umgesetzt werden, indem die vorhergegangenen State aus der $ionicHistory herausgelesen werden können und der Controller dann über if Anweisungen unterscheidet. Eine bequeme Möglichkeit für dieses Verhalten wird allerdings nicht angeboten.</li>
<li><strong>Performance<br />
</strong>Gerade, wenn die Applikation umfangreicher  wird leidet die Performance. Auch wenn die Entwicklung der Smartphones schnell voranschreitet, sind die Prozessoren und Arbeitsspeicher gerade in günstigen Geräten nicht so stark wie in Desktop Computern. Durch die vielen Scopes und Listener die durch Angular.js entstehen, werden komplexere Apps schnell zu anspruchsvoll für diese Smartphones. Spezielle Angular Plug-Ins die das ständige horchen auf Updates der Values wieder unterbinden verbessern die Performance. Das ist aber nicht gerade Sinn und Zweck, die Features eines Frameworks auszuschalten, um es verwenden zu können.</li>
</ul>
<p>Auch, wenn es in der Praxis in sehr umfangreichen und individuellen Applikationen Schwierigkeiten gibt, die manuell und manchmal umständlicher als gewohnt gelöst werden müssen, kann ich das Framework durchaus empfehlen. Die Kombination von fertigen UI Elementen und Funktionen die speziell für mobile Apps kreiert wurden und die komfortable Programmierweise von Angular.js, ermöglichen zeitsparend Webapps zu entwickeln, die für den Benutzer nativen Applikationen sehr ähnlich sind. Wer nun neugierig geworden ist kann sich auf der <a href="http://ionicframework.com/">Ionic Website</a> das Projekt runterladen und in der <a href="http://ionicframework.com/docs/">Doku</a> alle Komponenten und Funktionen finden die das Framework bietet.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/hybrid-apps-mit-ionic-erstellen/">Hybrid Apps mit Ionic erstellen</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gatherer: der erst Test</title>
		<link>https://mobile.fhstp.ac.at/tests/gatherer-der-erst-test/</link>
		
		<dc:creator><![CDATA[Desiree Zottl]]></dc:creator>
		<pubDate>Mon, 13 Oct 2014 08:47:01 +0000</pubDate>
				<category><![CDATA[Tests]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[Gatherer]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[Usability]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=4653</guid>

					<description><![CDATA[<p>Seit dem letzten Semester ist viel Zeit vergangen. Aus Sommer wurde Herbst und aus Kiwano wurde Gatherer. Gatherer soll ein Name sein, der auch zum Produkt passt. “gatherer” kommt aus dem Englischen und bedeutet Sammler und “to gather” bedeutet sammeln. Genau das, soll Gatherer auch tun. Menschen auf einfache und effektive Art zusammen bringen. Aufgrund <a class="read-more" href="https://mobile.fhstp.ac.at/tests/gatherer-der-erst-test/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/tests/gatherer-der-erst-test/">Gatherer: der erst Test</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Seit dem letzten Semester ist viel Zeit vergangen. Aus Sommer wurde Herbst und aus Kiwano wurde Gatherer. Gatherer soll ein Name sein, der auch zum Produkt passt. “gatherer” kommt aus dem Englischen und bedeutet Sammler und “to gather” bedeutet sammeln. Genau das, soll Gatherer auch tun. Menschen auf einfache und effektive Art zusammen bringen. Aufgrund des neuen Namens muss ein komplettes Rebranding vorgenommen werden. Dabei wollten wir gleich auch das bisherige User Interface überarbeiten.</p>
<p><span id="more-4653"></span></p>
<p>Am 8. Oktober 2014 haben wir daher mit acht Studienkollegen einen kurzen Usability-Test durchgeführt, um unseren iOS Prototyp zu testen. Dieser umfasste zu diesem Zeitpunkt neun Screens, die einen Event-Erstellungsprozess abbilden.</p>
<p>Der Test hat viele Erkenntnisse zu Tage gebracht. Einerseits wurden einige Bugs gefunden. Beispielsweise ist die App an manchen Stellen abgestürzt. Das was uns aber besonders wichtig war, waren Usability-, UX- oder Verständnis-Probleme.</p>
<p><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/10/IMG_8200.jpg"><img fetchpriority="high" decoding="async" class="aligncenter size-medium wp-image-4658" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/10/IMG_8200-300x225.jpg" alt="Gatherer Usability Test" width="300" height="225" /></a></p>
<p><b>Probleme</b></p>
<p><b>Desiree Zottl Problem</b><br />
Nach dem Login, kamen die User auf den Start-Screen, welcher zu diesem Zeitpunkt nicht sehr viel zeigt, bis auf eine Box mit dem User-Profil und einem Button. Vier von acht Probanden, haben sich hier sehr gewundert, dass sie Desiree Zottl sind.</p>
<p><b>Start-Screen leitet auf keine Aktion hin</b><br />
Auf dem Start-Screen waren viele User ein wenig verloren. Ohne den Hinweis, dass sie bitte jetzt ein neues Event anlegen sollen, hätte kaum jemand den grünen Button gefunden.</p>
<p><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/10/IMG_8204.png"><img decoding="async" class="aligncenter wp-image-4655 size-medium" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/10/IMG_8204-200x300.png" alt="Gatherer - Startscreen" width="200" height="300" /></a></p>
<p><b>Durch Tastatur wichtige Funktion abgeschnitten</b><br />
Beim Lösen mancher Aufgaben hatten die Probanden Probleme wichtige Funktionen zu erwischen, da sie durch die Tastatur oder Suchergebnisse abgeschnitten oder nicht erreichbar waren.</p>
<p><b>Switch unklar</b><br />
Beim Hinzufügen eines Termins zu einem Event kann mit einem Switch zwischen ganztägigen und zeitabhängigen Terminen gewechselt werden. Hier war für einige Probanden unklar, ob der Switch gerade aktiv ist oder nicht.</p>
<p><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/10/IMG_8207.png"><img decoding="async" class="aligncenter wp-image-4656 size-medium" title="Gatherer - WANN" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/10/IMG_8207-200x300.png" alt="Gatherer - WANN" width="200" height="300" /></a></p>
<p><b>Buttons teilweise zu klein</b><br />
Einige der Buttons sind zu klein und mussten von den Testperson oft mehrmals gedrückt werden, bevor die Funktion ausgeführt wurde. Dies hat natürlich Verwirrung gestiftet, weil die Testpersonen den Eindruck hatten, dass etwas nicht funktioniert hat.</p>
<p><b>Pflichtfelder hervorheben</b><br />
In einigen Fällen war es für die Probanden unklar, welche Felder ausgefüllt werden müssen und welche nicht. Es ist auch nicht eindeutig, ab wann ein Event ausreichend ausgefüllt ist, um es speichern zu können.</p>
<p><b>Viele Schritte</b><br />
Einige Probanden haben angemerkt, dass es eventuell mühsam ist so viele Schritten durchlaufen zu müssen, wenn man die App oft nützt.</p>
<p><b>Zum Ausfüllen Extra-Klick notwendig</b><br />
Bei den meisten Screens muss zuerst ein Plus-Button gedrückt werden, bevor die Felder ausgefüllt werden können. Ein Proband hat angemerkt, dass das eigentlich nicht notwendig ist und Zeit verbraucht.</p>
<p><b>Verwirrende Navigation bei Zusammenfassung</b><br />
Tippt man von der Zusammenfassung auf einen der Bereiche, springt man quasi wieder zurück und muss dann alle folgenden Schritte erneut durchlaufen. Das hat bei einigen Probanden für Verwirrung gesorgt.</p>
<p><b>Lösungen</b></p>
<p><b>Start-Screen</b><br />
Da der Start-Screen beim ersten Aufruf sehr leer ist soll er in Zukunft von Anfang an mehr dazu einladen neue Events anzulegen. Auch wollen wir eventuell auf das Anlagen eines Profils für Gatherer verzichten.</p>
<p><b>Wo zu Was</b><br />
Um die Anzahl der Schritte bis zum Beenden des Erstellungsprozesses zu reduzieren und Events zu vereinfachen wird der “Wo”-Screen wegfallen und als einfaches Textfeld in den “Was”-Screen wandern.</p>
<p><b>Unklarheiten aufräumen</b><br />
Einige Dinge, waren nicht zu 100% klar bei den Usern, die wollen wir in nächster Zeit versuchen auszuräumen.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/tests/gatherer-der-erst-test/">Gatherer: der erst Test</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>gulp.js &#8211; The streaming build system</title>
		<link>https://mobile.fhstp.ac.at/allgemein/gulp-js-streaming-build-system/</link>
		
		<dc:creator><![CDATA[Desiree Zottl]]></dc:creator>
		<pubDate>Thu, 29 May 2014 19:14:34 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=4503</guid>

					<description><![CDATA[<p>Um die Ladezeit von Webseiten zu verbessern, versuchen wir durch Komprimieren von Bildern sowie verketten und minifying von JavaScript und CSS und viele andere Tasks, Dateigrößen zu reduzieren. Dazu kommen zuvor noch Preprozessoren und Postprozessoren wie SASS und Autoprefixer die auf die CSS Files angewendet werden. Die Liste an Tasks, durch die die Files müssen, wird immer <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/gulp-js-streaming-build-system/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/gulp-js-streaming-build-system/">gulp.js &#8211; The streaming build system</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Um die Ladezeit von Webseiten zu verbessern, versuchen wir durch Komprimieren von Bildern sowie verketten und minifying von JavaScript und CSS und viele andere Tasks, Dateigrößen zu reduzieren. Dazu kommen zuvor noch Preprozessoren und Postprozessoren wie SASS und Autoprefixer die auf die CSS Files angewendet werden. Die Liste an Tasks, durch die die Files müssen, wird immer länger. Automatisierte Taskrunner wie Grunt ersparen dem Developer hier viel Zeit. Noch schneller und intuitiver arbeitet der Streambuilder Gulp.js.</p>
<p><span id="more-4503"></span></p>
<p>Gulp verwendet Node.js streams, welche es schnell machen, da keine temporären Dateien auf die Festplatte geschrieben werden müssen. Gulp arbeitet so, wie man sich ein Buildsystem vorstellt. Die Quelldateien werden eingelesen, durch verschiedene Plugins geleitet, die sie modifizieren und am Ende werden die neuen Files ausgegeben. Wie eine jQuery Verkettung, welche verschiedene Aktionen in der angegebenen Reihenfolge ausführt.</p>
<p><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/05/gulp-process.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-4505" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/05/gulp-process.jpg" alt="gulp-process" width="600" height="189" /></a></p>
<p>&nbsp;</p>
<h2>Installation</h2>
<p>Um Gulp über den Node Package Manger installieren zu können, muss bereits Node am Rechner verfügbar sein. Über folgenden Konsolenbefehl ist es dann möglich Gulp global im System zu installieren:</p>
<pre class="brush: jscript; title: ; notranslate">
npm install gulp -g
</pre>
<p>Mac User müssen den Befehl eventuell mit sudo starten, um Administrationsrechte zu erlangen.</p>
<pre class="brush: jscript; title: ; notranslate">
sudo npm install gulp -g
</pre>
<p>&nbsp;</p>
<p>Danach können beliebig viele Plugins installiert werden, die für die Tasks, die später ausgeführt werden sollen, benötigt werden. Vom gulp-autoprefixer bis zu gulp-zip gibt es derzeit 717 praktische Plugins. Ein Sass-Compiler beispielsweise, kann über folgendes Kommando installiert werden:</p>
<pre class="brush: jscript; title: ; notranslate">
npm install gulp-sass
</pre>
<p>Eine Liste aller verfügbaren Plugins findet sich unter <a href="http://gulpjs.com/plugins">http://gulpjs.com/plugins</a>.</p>
<h2>Gulpfile</h2>
<p>Nun können wir unser gulpfile.js schreiben, in dem definiert wird, welche Tasks auf welche Files angewendet werden sollen.</p>
<p>Zuerst müssen wir alle Plugins die wir verwenden möchten laden.</p>
<pre class="brush: jscript; title: ; notranslate">
var gulp = require ('gulp');
var sass = require ('gulp-sass');
var autoprefixer = require('gulp-autoprefixer');
...
</pre>
<p>Danach können wir beispielsweise einen Task auf unsere Styles anlegen, der die sass Files einliest, diese zu css kompiliert und durch den Autoprefixer laufen lässt. Am Ende sollen sie im Zielordner gespeichert werden.</p>
<pre class="brush: jscript; title: ; notranslate">
gulp.task('styles', function() {
  return gulp.src('assets/styles/*.scss')
    .pipe(sass({outputStyle: 'expanded'}))
    .pipe(autoprefixer('last 2 version', 'ie8'))
    .pipe(gulp.dest('dist/styles'));
});
</pre>
<p>Die verschiedenen Plugins können verschieden konfiguriert werden. Dies ist in der jeweiligen Dokumentation beschrieben.</p>
<p>Um diesen Task nun immer automatisch auszuführen, wenn Änderungen in den sass Files vorgenommen wurden, kann ein entsprechender watch Task angelegt werden.</p>
<pre class="brush: jscript; title: ; notranslate">
gulp.task('watch', function() {
  gulp.watch('assets/styles/*.scss', &#x5B;'styles']);
});
</pre>
<p>Nun in der Konsole den watch Task nur noch über</p>
<pre class="brush: jscript; title: ; notranslate">
gulp watch
</pre>
<p>starten.</p>
<h2>Slush</h2>
<p>So wie Yeoman bereits Gerüste für Grunt Tasks generiert, kann ein Gulp Projekt mit Slush automatisiert angelegt werden. Die Dokumentation dazu findet sich unter <a href="http://slushjs.github.io">http://slushjs.github.io</a>. Alle praktischen Tasks für Webapps, Angular Apps und viele viele mehr, können über die Generatoren automatisch angelegt werden. Eine Liste aller Generatoren ist unter <a href="http://slushjs.github.io/generators">http://slushjs.github.io/generators</a> verfügbar.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/gulp-js-streaming-build-system/">gulp.js &#8211; The streaming build system</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>codefront.io</title>
		<link>https://mobile.fhstp.ac.at/allgemein/codefront-io/</link>
		
		<dc:creator><![CDATA[Desiree Zottl]]></dc:creator>
		<pubDate>Wed, 28 May 2014 11:29:50 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[codefront]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Konferenz]]></category>
		<category><![CDATA[Linz]]></category>
		<category><![CDATA[Sass]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=4492</guid>

					<description><![CDATA[<p>Acht Studierende der Masterklasse Mobiles Internet des Studiengangs Digitale Medientechnologien besuchten gemeinsam mit Grischa Schmiedl und Kerstin Blumenstein am 10. Mai 2014 die Front-End Developement Konferenz codefront.io. In der nicht weit von St. Pölten entfernten Johannes Kepler Universität in Linz fanden den ganzen Tag parallel in vier Hörsälen Vorträge zu verschiedensten Themen statt. Die Themen der <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/codefront-io/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/codefront-io/">codefront.io</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Acht Studierende der Masterklasse Mobiles Internet des Studiengangs Digitale Medientechnologien besuchten gemeinsam mit Grischa Schmiedl und Kerstin Blumenstein am 10. Mai 2014 die Front-End Developement Konferenz codefront.io. In der nicht weit von St. Pölten entfernten Johannes Kepler Universität in Linz fanden den ganzen Tag parallel in vier Hörsälen Vorträge zu verschiedensten Themen statt.</p>
<p><span id="more-4492"></span></p>
<p><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/05/10312600_793285870695973_4846584541707797059_n.jpg"><img loading="lazy" decoding="async" class="aligncenter wp-image-4495 size-medium" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/05/10312600_793285870695973_4846584541707797059_n-300x225.jpg" alt="10312600_793285870695973_4846584541707797059_n" width="300" height="225" /></a></p>
<p>Die Themen der Konferenz waren sehr vielfältig. Das Spektrum reichte von Entwickler-Themen wie Angular JS und weiteren JavaScript Vorträgen über Responsive Web Design und SASS bis hin zu User Interface Design und Daten Visualisierung. Dadurch konnte sich jede/r die interessantesten Themen heraussuchen.</p>
<p>Einer der spannendsten Vorträge war der des Gründers des bekannten Smashing Magazine, Vitaly Friedman (Twitter: @smashingmag), über Responsive Web Design. Der Talk mit dem Titel &#8220;Real-Life Responsive Web Design&#8221; deckte sehr viele wichtige Aspekte ab, die heutzutage für die Erstellung von flexiblen Web-Projekten wichtig sind.</p>
<p><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/05/10253922_793285817362645_2829413033242432445_n.jpg"><img loading="lazy" decoding="async" class="aligncenter wp-image-4494 size-medium" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/05/10253922_793285817362645_2829413033242432445_n-300x225.jpg" alt="10253922_793285817362645_2829413033242432445_n" width="300" height="225" /></a></p>
<p>Auch sehr spannend war der Vortrag von Monica Dinculescu (Twitter: @notwaldorf). Sie arbeitet bei Google an der Entwicklung des eigenen Browsers Chrome und sprach über sechs Tricks, wie Google seine Chrome User glücklich macht. Damit gab sie einen spannenden Einblick hinter die Kulissen der Arbeit von Google.</p>
<p>Die Designer/innen und Entwickler/innen der Masterklasse Mobiles Internet konnten sehr viel aus den verschiedenen Vorträgen mitnehmen und werden auch bei der nächsten Konferenz in Österreich wieder dabei sein.</p>
<p><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/05/10178088_565304850255008_7360456056746908306_n.jpg"><img loading="lazy" decoding="async" class="aligncenter wp-image-4493 size-medium" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/05/10178088_565304850255008_7360456056746908306_n-300x225.jpg" alt="10178088_565304850255008_7360456056746908306_n" width="300" height="225" /></a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/codefront-io/">codefront.io</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Das war die Kod.io 2014 in Linz</title>
		<link>https://mobile.fhstp.ac.at/allgemein/das-war-die-kod-io-2014-linz/</link>
		
		<dc:creator><![CDATA[Desiree Zottl]]></dc:creator>
		<pubDate>Mon, 03 Mar 2014 20:13:07 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Developerkonferenz]]></category>
		<category><![CDATA[Kod.io]]></category>
		<category><![CDATA[Linz]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=4189</guid>

					<description><![CDATA[<p>Im Zuge unserer Vertiefung &#8220;mobiles Internet&#8221; haben einige von uns beschlossen die Developerkonferenz Namens &#8220;Kod.io&#8221; in Linz am 01.03.2014 zu besuchen. Die Konferenz selbst fand zum zweiten Mal statt &#8211; die erste war 2013 in Istanbul. Die Konferenz fand im eindrucksvollen Gebäude der ARS Electronica statt. Es waren knapp 300 internationale Teilnehmer, sowie 18 Speaker <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/das-war-die-kod-io-2014-linz/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/das-war-die-kod-io-2014-linz/">Das war die Kod.io 2014 in Linz</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Im Zuge unserer Vertiefung &#8220;mobiles Internet&#8221; haben einige von uns beschlossen die Developerkonferenz Namens &#8220;Kod.io&#8221; in Linz am 01.03.2014 zu besuchen. Die Konferenz selbst fand zum zweiten Mal statt &#8211; die erste war 2013 in Istanbul. Die Konferenz fand im eindrucksvollen Gebäude der ARS Electronica statt. Es waren knapp 300 internationale Teilnehmer, sowie 18 Speaker und viele fleißige Helfer und Organisatoren auf der Konferenz unterwegs. <span id="more-4189"></span>Am Abend zuvor gab es bereits ein nettes Meet-and-Greet mit allen Teilnehmern auf der Welcome-Party. Die Konferenz selbst startete am Samstag um 08:30 mit der Registrierung sowie einer Willkommensrede der Organisatoren und Vertreter der Stadt Linz. Es wurde gleich zu Beginn, und auch während den Vorträgen immer wieder darauf Aufmerksam gemacht, dass die Veranstaltung viel Wert auf politisch korrektes Verhalten legt, was auch bei den Teilnehmern sehr gut ankam. Die Vortrage waren alle durch die Bank sehr spannend, vielfältig und mitreißen. Hier eine kurze Zusammenfassung der Beiträge die uns am besten gefallen haben (ein paar konnten wir leider nicht sehen, da es 2 Tracks mit Vorträgen gab):</p>
<p><a href="http://lea.verou.me/">Lea Verou</a> hielt eine der beiden Keynote Vorträge mit dem Thema &#8220;The Chroma Zone Engineering Color on the Web&#8221;. Dabei zeigte sie die unterschiedlichsten Methoden der Farbimplementierung in CSS auf. Neben der Analyse des Farbraumes RGB und der Erweiterung um den Alphakanal RGBA, erklärte sie auch die anderen Möglichkeiten um Farbwerte auszudrücken, wie HSL (Hue, Saturation, Luminance) und HSLA (Hue, Saturation, Luminance, Alpha). Neben zahlreichen nützlichen Javascript und Sass Funktionen zur Berechnung der Farbwerte stelle sie auch die Neuerungen im neuen W3C Color Modul 4 vor. So ist vorgesehen, dass es eine neue Möglichkeit für den Ausdruck der Farbwerte gibt, nämlich HWB, diese Möglichkeit kennt man auch aus Photoshop. Außerdem gibt es erstmalig Variablen direkt im CSS. So gibt es dann die neue Variable currentColor, die verwendet werden kann um die aktuelle Farbe in einer Regel wieder zu verwenden. Außerdem gibt es eine Funktion gray() über die mit der Angabe von Prozenten der Grauton direkt im CSS gesteuert werden kann. Die Neuerungen werden kaum von Browsern unterstützt, jedoch zeigte Lea Fallbacks um die Neuerungen jetzt schon zum implementieren. Alles in allem, war es ein sehr spannender Talk und Lea überzeugte nicht zuletzt mit einer <a href="http://leaverou.github.io/chroma-zone/">interaktiven Präsentation</a> und einigen Live-Code Beispielen.</p>
<p><a href="https://twitter.com/PascalPrecht">Pascal Precht</a> präsentierte in seiner ebenfalls <a href="http://pascalprecht.github.io/slides/angularjs-and-i18n">interaktiven Präsentation</a> Dependency Injection und Two-Way Data-Binding mit Angular.js. Darüber hinaus behandelte er das Thema Internationalisierung und Lokalisierung und zeigte, wie man über die Möglichkeiten von Angular hinaus, mit Angular-Translate Texte und Formate einfach asynchron laden und dynamisch anpassen kann.</p>
<p><a href="http://kmikael.com">Mikael Konutgan</a> von All About Apps zeigte in einer Gegenüberstellung von Objective C mit Ruby, die von vielen unerwarteten Gemeinsamkeiten. Er verglich den Syntax der beiden Programmiersprachen und vermittelte den Zuschauern, das es viel mehr Ähnlichkeiten als Unterschiede gibt, vor allem wenn man von &#8220;modernen Objective C&#8221; ausgeht. Und für alle die den gewöhnungsbedürftigen Block Syntax von Objective C im Kopf behalten, verwies Mikael noch auf die Seite <a href="http://fuckingblocksyntax.com/">http://fuckingblocksyntax.com/</a>, wo er selbst täglich nachschlägt. Seine Slides mit dem genauen Codevergleich sind unter <a href="https://speakerdeck.com/kmikael/objective-c-for-rubyists">https://speakerdeck.com/kmikael/objective-c-for-rubyists</a> zu finden.</p>
<p><a href="https://twitter.com/macdevnet">Steve Scott</a> gab uns in seiner Keynote &#8220;Going Native&#8221; einen amüsanten Einblick in sämtlich Programmiersprachen, mit denen er selbst in der Vergangenheit gearbeitet hat bzw. heute noch arbeitet. Anhand dieses Streifzuges durch die Zeit zwischen 1987 bis heute zeigte Steve, wie sich die &#8220;native&#8221; Programmierung von damals, wo Entwickler Code auf Systemeben schrieben, im Vergleich zur Gegenwart, wo großteils Frameworks wie beispielsweise Cocoa Touch für iOS verwendet werden unterscheidet. Auch die Entwicklung von mobilen Webapplikationen setzte Steve in seiner Keynote auf dieselbe Ebene, wie die Entwicklung von &#8220;nativen&#8221; Apps für Plattformen wie iOS, Android oder Windows. Der Browser bietet in diesem Fall die Plattform und HTML, CSS und Javascript ein Framework zur Entwicklung von Applikationen. Den wesentlichen Vorteil von plattformspezifischen Apps sieht Steve vor allem in der User Experience, die aus seiner Sicht bei crossplatform Apps zu kurz kommt.</p>
<p><img loading="lazy" decoding="async" class="alignnone  wp-image-4228" alt="2014-03-01 17.28.31" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2014/03/2014-03-01-17.28.31.jpg" width="564" height="467" /></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/das-war-die-kod-io-2014-linz/">Das war die Kod.io 2014 in Linz</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Teil 2: Sails.js mit Backbone.js am Client kombinieren</title>
		<link>https://mobile.fhstp.ac.at/development/teils2-combining-node-js-sails-js-mit-backbone-js-client/</link>
		
		<dc:creator><![CDATA[Desiree Zottl]]></dc:creator>
		<pubDate>Thu, 23 Jan 2014 20:20:22 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Backbon.js]]></category>
		<category><![CDATA[Client]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[Require.js]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[Sails.js]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=3787</guid>

					<description><![CDATA[<p>Hat man sich für Sails.js als MVC Framework am Server entschieden, lässt sich das MVC Framework Backbone.js am Client sehr gut damit kombinieren. Ich möchte in diesem Beitrag zeigen, wie man zum Serverteil ein ineinandergreifendes modulares Frontend mit Hilfe von Underscore.js, Backbone.js und Require.js entwickeln kann. Backbone.js ist ein JavaScript Framework zum Entwickeln von Singe <a class="read-more" href="https://mobile.fhstp.ac.at/development/teils2-combining-node-js-sails-js-mit-backbone-js-client/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/teils2-combining-node-js-sails-js-mit-backbone-js-client/">Teil 2: Sails.js mit Backbone.js am Client kombinieren</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hat man sich für Sails.js als MVC Framework am Server entschieden, lässt sich das MVC Framework Backbone.js am Client sehr gut damit kombinieren. Ich möchte in diesem Beitrag zeigen, wie man zum Serverteil ein ineinandergreifendes modulares Frontend mit Hilfe von Underscore.js, Backbone.js und Require.js entwickeln kann.</p>
<p><span id="more-3787"></span></p>
<p>Backbone.js ist ein JavaScript Framework zum Entwickeln von Singe Page Applikationen und unterstützt die Kommunikation zum Server über eine RESTful API. Es besteht aus Models, Collections, Views und Router. Für die Verwendung ist nur die Einbindung von Underscore.js  erforderlich, allerdings können viele andere JavaScript Erweiterungen gut damit kombiniert werden.</p>
<h2></h2>
<h2>Backbone Model</h2>
<p>Das Model repräsentiert die Daten der Applikation und stellt die kleinste mögliche Einheit an Funktionalitäten dar. Um ein Backbone Model zu generieren, muss lediglich die Backbone Klasse Backbone.Model extendet werden, dann kann es mit eigenen Funktionalitäten erweitert werden. Eine Möglichkeit sind beispielsweise Defaultwerte für bestimmte Attribute des Models.</p>
<p>Möchte man das Model einfach vom Server übernehmen, ohne Funktionalitäten hinzuzufügen, reichen die folgenden Zeilen zum Generieren des Models.</p>
<pre class="brush: jscript; title: ; notranslate">
var Event = Backbone.Model.extend({

});

return Event;
</pre>
<h2></h2>
<h2>Backbone Collection</h2>
<p>Eine Collection ist eine Gruppe von Models. Normalerweise enthält eine Collection einen Typ von Models und kann wie diese durch eigene Funktionalitäten erweitert werden. Man verwendet das &#8220;model&#8221; Property, um der Collection zu sagen, von welcher Modelklasse jedes Item in der Collection generiert werden soll.</p>
<pre class="brush: jscript; title: ; notranslate">
var EventList = Backbone.Collection.extend({
  model: Event
});

return EventList;
</pre>
<h2>Backbone View</h2>
<p>Views zeigen die Daten der Applikation in der HTML Seite an. Dazu können Templates verwendet werden, die in der View definiert, oder von extern geladen werden können. Die initialize Funktion wird in Backbone beim Instanzieren vom Objekt immer aufgerufen. Davon ausgehend, können dann weitere Funktionen ausgeführt werden. Hier ein Beispiel für eine View, die den Titel des Models ausgibt.</p>
<pre class="brush: jscript; title: ; notranslate">
var EventListItemView = Backbone.View.extend({
  tagName:'li',
  template:_.template('&lt;h1&gt;&lt;%= title %&gt;&lt;/h1&gt;'),

  initialize:function () {
    this.model.bind('change', this.render, this);
  },

  render:function () {
    $(this.el).html(this.template(this.model));
  return this;
  }

});

return EventListItemView;
</pre>
<h2>Templates</h2>
<p>Am Codebeispiel der View sieht man auch bereits die Verwendung des Underscore.js Template. Diese sind sehr nützlich, um HTML aus JSON Daten zu rendern und ermöglichen das Einfügen von Variablen durch Platzhalter &lt;%= Variablenname %&gt;. Ebenso kann beliebiger JavaScript Code ausgeführt werden  &lt;% JavaScript Code %&gt;. Die HTML Snippets können nicht nur direkt in der View geschrieben werden, sondern auch als sogenannte &#8220;Mikrotemplates&#8221;,  in der HTML Seite eingefügt  und durch die Id ausgewählt werden.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script id=&quot;event&quot; type=&quot;text/template&quot;&gt;
  &lt;h1&gt;&lt;%= title %&gt;&lt;/h1&gt;
  &lt;div&gt;&lt;%= description %&gt;&lt;/div&gt;
&lt;/script&gt;
</pre>
<p>Die Templates können auch in extra Files ausgelagert werden und vor allem bei Verwendung von Require.js und dem Require Text Modul, bei Bedarf einfach in die View geladen werden. Näheres dazu später im Beitrag unter &#8220;Verwendung von Require.js&#8221;.</p>
<h2>Backbone Routing</h2>
<p>Routen werden verwendet, um je nach URL, in der Applikation bestimmte Funktionen auszuführen und eine Browser-History zu erzeugen. Interpretiert wird dabei nur der Teil der URL nach dem Hash Tag. Damit kann auch der Einstiegspunkt zum Rendern der View erfolgen.</p>
<p>Im folgenden Beispiel würde die Url http://www.myDomain.at/#/events die EventListView rendern, für jede andere URL kann eine default Route durch *action definiert werden.</p>
<p>Dynamische Routenparameter können durch Doppelpunkt, zur Angabe eines Parameters, oder *,  zur Angabe beliebig vieler Parameter, definiert werden.</p>
<pre class="brush: jscript; title: ; notranslate">

var appRouter = Backbone.Router.extend({
  routes : {
    'events' : 'showEvents',
    'events/:id' : 'showEvent',
    'download/*path' : 'downloadFile',
    '*action' : 'defaultRoute'
  },

  initialize: function() {
    Backbone.history.start({
      pushState: true
    });
   },

  showEvents: function() {
    // init EventListView
  },
  showEvent: function(id) {
    // init EventView
  },
  downloadFile: function(path) {
    // download File
  },
  defaultRoute: function() {
    // init default view
  }

});

return appRouter;

</pre>
<h2>Verwendung von Require.js</h2>
<p>Je nach Applikationsumfang kann es sehr viele Models, Collections und Views geben, welche nicht alle immer sofort und gleichzeitig benötigt werden und in der richtigen Reihenfolge integriert werden müssen, da sie voneinander abhängen.<br />
Um dieses Problem zu lösen und die Ladezeiten gering zu halten, ermöglicht Require.js das modulare Laden von JavaScript Files. Durch die Angabe der Abhängigkeiten eines JavaScript Moduls werden die Files immer dann geladen, wenn sie benötigt werden.</p>
<p>Als Script Tag wird lediglich Require.js selbst eingebunden und im Attribut data-main der Pfad zum Einstiegspunkt angegeben.</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;/js/plugins/require.js&quot; data-main=&quot;/js/main.js&quot;&gt;&lt;/script&gt;
</pre>
<p>In diesem Fall startet die Applikation in der main.js, in der es sich anbietet die Konfiguration für Require anzugeben. Beispielsweise können für die Pfade zu den einzelnen JavaScript Files sprechende Namen vergeben werden, um sie später leichter als Abhängigkeit in einem File angeben zu können.</p>
<pre class="brush: jscript; title: ; notranslate">
require.config({
  paths: {
    // libraries
    jquery: 'js/jquery.min',
    underscore: 'js/underscore-min',
    backbone: 'js/backbone-min',
    // plugins
    text: 'js/plugins/text',
    // views
    eventListView: 'app/views/eventListView',
    eventListItemView: 'app/views/eventListItemView',
    // Models
    event: 'app/models/event',
    // collections
    eventList: 'app/collections/eventList',
    // routing
    router: 'app/routes/router'
  }
});
</pre>
<p>Danach wird in diesem Beispiel das Routing instanziert, welches ab diesem Zeitpunkt die Aktionen, in unserem Fall das Rendern der Views je nach Url, übernimmt. Durch die Angabe der Abhängigkeit im define wird das benötigte File automatisch geladen. Als Parameter wird der Funktion ein beliebiger Name übergeben, unter welchem das Router Modul dann zur Verfügung steht.</p>
<pre class="brush: jscript; title: ; notranslate">
define(&#x5B;'router'], function(Router) {
  var myRouter = new Router;
});
</pre>
<p>Im File router.js müssen nun ebenfalls die Abhängigkeiten angegeben werden, damit die entsprechenden Datein geladen werden.</p>
<pre class="brush: jscript; title: ; notranslate">
define(&#x5B;
  'jquery',
  'underscore',
  'backbone',
  'eventList',
  'eventListView'
], function($, _, Backbone, EventList, EventListView){
  var appRouter = Backbone.Router.extend({
    routes : {
      'events' : 'showEvents',
      ...
</pre>
<p>In allen anderen JavaScript Modulen verhält es sich gleich. Über define werden die Pfade oder die dafür vergebenen Namen angegeben, die zum Ausführen des Codes benötigt werden. Der gesamte Code des Moduls wird in eine Funktion gewrappt, die als Parameter die eigene Bezeichnung der abhängigen Module in der gleichen Reihenfolge wie im define nimmt.</p>
<p>Durch das Require.js Text Plugin ist es möglich, in einer View das benötigte Template von extern zu Laden. Über text! + die Url des Templates kann angegeben werden, welches HTML File integriert werden soll.</p>
<pre class="brush: jscript; title: ; notranslate">
define(&#x5B;
 'jquery',
 'underscore',
 'backbone',
 'text!templates/event.html'
], function ($, _, Backbone, tmp) {
  var EventListItemView = Backbone.View.extend({
    tagName:'li',
    template:_.template(tmp)
  });
  return EventListItemView
});
</pre>
<p>&nbsp;</p>
<h2>Kombination mit Sails.js am Server</h2>
<p>Nachdem das Model, die Collection und die View definiert wurden, müssen diese nun auch mit Models gefüllt werden. Die Daten dazu kommen von unserem Sails.js Server, der im Blogbeitrag Teil1: Sails.js Einführung in das Backend MVC Framework vorgestellt wurde.</p>
<p>Backbone bietet eine elegante Integration von RESTful Services. Stellt das Backend eine RESTful API zur Verfügung, welche Daten über GET abruft, über POST erstellt, über PUT updated und über DELETE löscht, ist es einfach, diese mit Backbone zu verwenden. Sails.js legt automatisch, sofern die REST Blueprints aktiviert sind, für jedes Model Routen mit diesem HTTP Methoden an. In ihrer Dokumentation nennen sie dieses System sogar die &#8220;Backbone Convention&#8221;. <a href="http://sailsjs.org/#!documentation/routes">http://sailsjs.org/#!documentation/routes</a></p>
<pre class="brush: jscript; title: ; notranslate">
# Backbone Conventions
    GET   :    /:controller              =&gt; findAll()
    GET   :    /:controller/read/:id     =&gt; find(id)
    POST  :    /:controller/create       =&gt; create()
    POST  :    /:controller/create/:id   =&gt; create(id)
    PUT   :    /:controller/update/:id   =&gt; update(id)
    DELETE:    /:controller/destroy/:id  =&gt; destroy(id)
</pre>
<p>Das Model sowie die Collections besitzen in Backbone ein Attribut url oder urlRoot, welches angibt, von welcher Server Adresse sie die Daten bekommen. Wir erweitern also unser Model und unsere Collection an Events von oben um dieses Attribut:</p>
<pre class="brush: jscript; title: ; notranslate">
var Event = Backbone.Model.extend({
  urlRoot: '/event'
});

return Event;
</pre>
<pre class="brush: jscript; title: ; notranslate">
var EventList = Backbone.Collection.extend({
  model: Event
  url: '/event'
});

return EventList;
</pre>
<p>Heißt das Model am Sails Server Event, lautet die dazu automatisch generierte Url /event. Diese Information reicht der Collection am Client, um all ihre Abfragen, Updates und Löschbefehle richtig zu adressieren.</p>
<p>Jedes Backbone Model besitzt die Methoden fetch(), save() and destroy(), wobei save einen create oder update Befehl bewirkt, je nachdem ob das Model bereits eine ID hat oder nicht.</p>
<p>Erweitert man also die Collection wieder und definiert eine initialize Funktion, die wie oben bereits erwähnt beim Instanzieren eines Objekts immer aufgerufen wird, kann man beispielsweise an dieser Stellte die fetch() Methode aufrufen, um die Daten vom Server zu holen.</p>
<pre class="brush: jscript; title: ; notranslate">
var EventList = Backbone.Collection.extend({
  model: Event
  url: '/event',

  initialize: function() {
    this.fetch();
  }
});

return EventList;
</pre>
<p>Hier wird laut den HTTP Methoden, die Backbone und Sails verwenden, ein GET Befehl an die Url http://www.myDomain.at/event gesendet. Sails liefert dann ein JSON mit allen Events zurück, welche dann als Backbone Event Models am Client verfügbar sind.</p>
<p>Das Zusammenspiel von Client und Server erfolgt so automatisiert und es müssen keine manuellen Requests geschickt oder am Server abgefangen werden.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/teils2-combining-node-js-sails-js-mit-backbone-js-client/">Teil 2: Sails.js mit Backbone.js am Client kombinieren</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AngularJS &#8211; Meine ersten Eindrücke</title>
		<link>https://mobile.fhstp.ac.at/development/angularjs-meine-ersten-eindruecke/</link>
		
		<dc:creator><![CDATA[Desiree Zottl]]></dc:creator>
		<pubDate>Fri, 15 Nov 2013 23:28:34 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[Angular JS]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MVC]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=3412</guid>

					<description><![CDATA[<p>JavaScript MVC Frameworks sind derzeit ein großes Thema, denn wir nutzten JavaScript um Daten vom Server hin und her zu schicken und implementieren immer mehr und mehr Logik welche im Browser ausgeführt wird.  Dies resultiert unter anderem auch aus der Entwicklung im Backend, wo immer öfters nur Daten in Form von JSON geliefert werden, anstatt <a class="read-more" href="https://mobile.fhstp.ac.at/development/angularjs-meine-ersten-eindruecke/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/angularjs-meine-ersten-eindruecke/">AngularJS &#8211; Meine ersten Eindrücke</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>JavaScript MVC Frameworks sind derzeit ein großes Thema, denn wir nutzten JavaScript um Daten vom Server hin und her zu schicken und implementieren immer mehr und mehr Logik welche im Browser ausgeführt wird.  Dies resultiert unter anderem auch aus der Entwicklung im Backend, wo immer öfters nur Daten in Form von JSON geliefert werden, anstatt fertiger Seiten zum Rendern im Browser. MVC Frameworks versprechen mehr Produktivität und Wartbarkeit, durch besser strukturierten Code in unserem Front-End.</p>
<p><span id="more-3412"></span></p>
<p>Im Rahmen einer Lehrveranstaltung an der FH lernte ich das Front-End Framework AngularJS kennen. Dabei habe ich ein paar sehr interessante Konzepte gefunden.<br />
</p>
<h3>Gefällt mir</h3>
<p></p>
<h4>Das Routing</h4>
<p>Der $routeProvider in Angular ermöglicht es Views, Controller und die aktuelle URL im Browser zusammen zu bringen. Durch das setzten der verschiedenen URLs je View ist das Vor- und Zurücknavigieren trotz Single-page application im Browser möglich.</p>
<pre class="brush: jscript; title: ; notranslate">
app.config(function($routeProvider){
  $routeProvider.when('/home', {
    templateUrl: 'partials/home.html',
    controller: 'homeController'
  });

  $routeProvider.when('/events', {
    templateUrl: 'partials/events.html',
    controller: 'eventsController'
  });

  $routeProvider.otherwise({ redirectTo: '/home' });

});
</pre>
<p>Wenn man also http://myAngularApp/#events im Browser lädt, lädt Angular das entsprechende Template in das vorher dafür definiert Element und ruft den dazugehörigen Controller auf in dem sich die Logik zur View befindet.</p>
<p>Neben diesen statischen URLs ist es auch möglich in der URL Parameter zu definieren.</p>
<pre class="brush: jscript; title: ; notranslate">
$routeProvider.when('/event/:eventTitle', {
  templateUrl: 'partials/eventDetail.html',
  controller: 'eventDetailController'
});
</pre>
<p>Somit kann das selbe Template mit unterschiedlichen Daten gefüllt werden und man erhält eine individuelle URL, was sich beispielsweise sehr gut für Detailansichten eignet.<br />
</p>
<h4>Die View</h4>
<p>Die Directive ng-View ergänzt das $route Service indem es das Template der aktuellen Route in das Grundlayout einfügt. Das Attribut ng-view gibt also an, wo im HTML Gerüst das jeweils geladene Template gerendert werden soll. Immer wenn sich die Route ändert, ändert sich auch die View nach den Konfigurationen des $route Service wie oben beschrieben.</p>
<pre class="brush: xml; title: ; notranslate">

&lt;section id=&quot;content&quot; ng-view&gt;

&lt;/section&gt;

</pre>
<p></p>
<h4>Die Templates</h4>
<p>Die oben erwähnten Templates sind die HTML Segmente die routenabhängig in das HTML Grundgerüst geladen werden. Sie können in eigene Files ausgelagert werden oder in script tags mit dem typ text/ng-template im gleichen Dokument liegen.</p>
<p>Die double curly brace Notation {{ }} ermöglicht Datenbindung an Ausdrücke im Markup. Diese werden jederzeit upgedated wenn sich der dazugehörige Wert an den sie gebunden sind ändert.</p>
<pre class="brush: xml; title: ; notranslate">

&lt;h1&gt; {{ title }} &lt;/h1&gt;

&lt;p&gt; {{ message }} &lt;/p&gt;

</pre>
<p></p>
<h4>Schleife im Markup</h4>
<p>Die ng-repeat Direktive wiederholt das Element auf das sie gesetzt wurde für jedes Objekt im Model. Somit kann das Markup für eine Liste direkt im HTML einmal geschrieben werden und wird dann automatisch wiederholt. Für mich ist das eine sehr nützliche Funktion und schönere Variante, als das Markup im JavaScript File zu schreiben und es dann in einer Schleife im JavaScript erst an ein Element im DOM zu hängen.</p>
<pre class="brush: xml; title: ; notranslate">

&lt;ul&gt;

  &lt;li ng-repeat=&quot;event in events&quot;&gt;

    &lt;h1&gt; {{ event.title }} &lt;/h1&gt;

    &lt;p&gt;  {{ event.date }} {{ event.location }}&lt;/p&gt;

  &lt;/li&gt;

&lt;/ul&gt;

</pre>
<p></p>
<h3>Gefällt mir nicht</h3>
<p></p>
<h4>Viele Direktiven im HTML</h4>
<p>Neben den notwendigen Direktiven um Model, View und Controller ans HTML zu binden und der praktischen ng-repeat Funktionalität, gibt es eine Vielzahl an weiterer Direktiven die als Attribute ins HTML geschrieben werden um Funktionalitäten auszulösen.</p>
<p>Durch ng-show=&#8221;!myFuntkion()&#8221; können beispielsweise Elemente angezeigt oder verborgen werden je nach Wert einer Variable oder Rückgabewert einer Funktion.</p>
<p>ng-click ist eine gängige Methode in Angular um click Events an Elemente zu binden, diese und weitere Attribute wie novalidate, ng-submit, ng-minlength, ng-maxlength, ng-hide, ng-list &#8230;.. und viele viele mehr verlagern für meinen Geschmack viel zu viel Logik ins Markup.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/angularjs-meine-ersten-eindruecke/">AngularJS &#8211; Meine ersten Eindrücke</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
