├── .gitignore
├── .jshintrc
├── .travis.yml
├── Gruntfile.js
├── README.md
├── bower.json
├── build
├── angular-preloaded.js
└── angular-preloaded.min.js
├── karma.conf.js
├── package.json
├── src
└── angular-preloaded.js
└── test
└── angular-preloaded_spec.js
/.gitignore:
--------------------------------------------------------------------------------
1 | bower_components
2 | node_modules
3 | .DS_Store
4 | .tmp
5 |
--------------------------------------------------------------------------------
/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "node": true,
3 | "browser": true,
4 | "esnext": true,
5 | "bitwise": true,
6 | "camelcase": true,
7 | "curly": true,
8 | "eqeqeq": true,
9 | "immed": true,
10 | "latedef": true,
11 | "newcap": true,
12 | "noarg": true,
13 | "quotmark": "single",
14 | "undef": true,
15 | "regexp": true,
16 | "unused": true,
17 | "trailing": true,
18 | "smarttabs": true,
19 | "globals": {
20 | "angular": false,
21 | "describe": false,
22 | "spyOn": false,
23 | "beforeEach": false,
24 | "it": false,
25 | "expect": false,
26 | "inject": false
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - '0.10'
4 | before_script:
5 | - npm install -g bower
6 | - npm install -g grunt-cli
7 | - bower install
8 | before_install:
9 | - "export DISPLAY=:99.0"
10 | - "sh -e /etc/init.d/xvfb start"
11 | - currentfolder=${PWD##*/}
12 | - if [ "$currentfolder" != 'angular-preloaded' ]; then cd .. && eval "mv $currentfolder angular-preloaded" && cd angular-preloaded; fi
13 |
--------------------------------------------------------------------------------
/Gruntfile.js:
--------------------------------------------------------------------------------
1 | module.exports = function(grunt) {
2 | require('load-grunt-tasks')(grunt);
3 |
4 | grunt.initConfig({
5 | pkg: grunt.file.readJSON('package.json'),
6 | dir: {
7 | build: 'build',
8 | temp: '.tmp',
9 | spec: 'test',
10 | src: 'src'
11 | },
12 | files: {
13 | src: '<%= dir.src %>{,*/}*.js',
14 | spec: '<%= dir.spec %>{,*/}*.js',
15 | },
16 | concat: {
17 | build: {
18 | src: ['<%= files.src %>'],
19 | dest: '<%= pkg.main %>'
20 | }
21 | },
22 | watch: {
23 | test: {
24 | files: ['<%= files.src %>', '<%= files.spec %>'],
25 | tasks: ['test']
26 | }
27 | },
28 | uglify: {
29 | build: {
30 | src: '<%= pkg.main %>',
31 | dest: '<%= pkg.minified %>'
32 | }
33 | },
34 | clean: ['<%= dir.build %>','<%= dir.temp %>'],
35 | jshint: {
36 | options: {
37 | jshintrc: '.jshintrc',
38 | reporter: require('jshint-stylish')
39 | },
40 | build: [
41 | 'Gruntfile.js',
42 | '<%= files.src %>'
43 | ]
44 | },
45 | karma: {
46 | options: {
47 | configFile: 'karma.conf.js'
48 | },
49 | single: {
50 | singleRun: true
51 | },
52 | continuous: {
53 | singleRun: false
54 | }
55 | }
56 | });
57 |
58 | grunt.registerTask('build', ['clean', 'test', 'concat', 'uglify']);
59 | grunt.registerTask('test', ['jshint', 'karma:single']);
60 | grunt.registerTask('test:continuous', ['jshint', 'karma:continuous']);
61 | };
62 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # angular-preloaded
2 |
3 | [](https://travis-ci.org/garbles/angular-preloaded)
4 |
5 | This AngularJS plugin allows you to preload data for your application by
6 | putting it into a special script tag. This is especially great for non-SPAs
7 | that want to use AngularJS.
8 |
9 | I am motivated by my previous attempts to preload data where I polluted
10 | the global state (_i.e._ `window`) and wrote services to pluck values off
11 | of it. This approach fully integrates with the AngularJS life cycle.
12 |
13 | ### Installing
14 |
15 | `bower install angular-preloaded`
16 |
17 | ### Using
18 |
19 | You can preload any data that you need by wrapping JSON in a script tag
20 | with `type=text/preloaded`.
21 |
22 | ```html
23 |
28 |
33 | ```
34 |
35 | You can now access the preloaded data from anywhere in your application by
36 | injecting `$preloaded`.
37 |
38 | ```javascript
39 | angular.module('app', ['gs.preloaded'])
40 | .controller('SomeCtrl', function ($preloaded) {
41 | // do something with $preloaded.
42 | $preloaded; // => { data: "point", another: { point: "of data" } }
43 | });
44 | ```
45 |
46 | __NOTE__: Your script tags must run _before_ anything using `$preloaded`, so
47 | I suggest putting them in your document's head.
48 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-preloaded",
3 | "version": "0.1.0",
4 | "authors": [
5 | "Gabriel Scholz "
6 | ],
7 | "description": "Preload data for your non-SPA AngularJS application",
8 | "main": "./build/angular-preloaded.js",
9 | "keywords": [
10 | "angular",
11 | "preload",
12 | "preloaded"
13 | ],
14 | "license": "MIT",
15 | "homepage": "https://github.com/garbles/angular-preloaded",
16 | "ignore": [
17 | "src",
18 | "node_modules",
19 | "bower_components",
20 | "test",
21 | "karma.conf.js",
22 | "package.json",
23 | "README.md",
24 | ".gitignore",
25 | ".jshintrc"
26 | ],
27 | "dependencies": {
28 | "angular": ">= 1.0.0"
29 | },
30 | "devDependencies": {
31 | "angular-mocks": ">= 1.0.0"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/build/angular-preloaded.js:
--------------------------------------------------------------------------------
1 | (function(window, angular, undefined) {'use strict';
2 |
3 | angular.module('gs.preloaded', [])
4 | .directive('script', ['$preloaded', function ($preloaded) {
5 | return {
6 | restrict: 'E',
7 | link: function (scope, el, attrs) {
8 | var data;
9 |
10 | if (attrs.type !== 'text/preloaded') {
11 | return;
12 | }
13 |
14 | data = JSON.parse(el.text());
15 |
16 | if (attrs.hasOwnProperty('name')) {
17 | $preloaded[attrs.name] = data;
18 | } else {
19 | angular.extend($preloaded, data);
20 | }
21 | }
22 | };
23 | }])
24 |
25 | .constant('$preloaded', {});
26 |
27 | })(window, window.angular);
28 |
--------------------------------------------------------------------------------
/build/angular-preloaded.min.js:
--------------------------------------------------------------------------------
1 | !function(a,b){"use strict";b.module("gs.preloaded",[]).directive("script",["$preloaded",function(a){return{restrict:"E",link:function(c,d,e){var f;"text/preloaded"===e.type&&(f=JSON.parse(d.text()),e.hasOwnProperty("name")?a[e.name]=f:b.extend(a,f))}}}]).constant("$preloaded",{})}(window,window.angular);
--------------------------------------------------------------------------------
/karma.conf.js:
--------------------------------------------------------------------------------
1 | module.exports = function(config) {
2 | config.set({
3 | basePath: '',
4 | frameworks: ['jasmine'],
5 | files: [
6 | 'bower_components/angular/angular.js',
7 | 'bower_components/angular-mocks/angular-mocks.js',
8 | 'src/**/*.js',
9 | 'src/*.js',
10 | 'test/**/*_spec.js',
11 | 'test/*_spec.js'
12 | ],
13 | exclude: [],
14 | reporters: ['progress'],
15 | port: 9876,
16 | colors: true,
17 | logLevel: config.LOG_INFO,
18 | autoWatch: true,
19 | browsers: ['PhantomJS', 'Firefox'],
20 | captureTimeout: 60000,
21 | singleRun: false
22 | });
23 | };
24 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-preloaded",
3 | "version": "0.1.0",
4 | "description": "Preload data for your non-SPA AngularJS application",
5 | "main": "./build/angular-preloaded.js",
6 | "minified": "./build/angular-preloaded.min.js",
7 | "directories": {
8 | "test": "test"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "https://github.com/garbles/angular-preloaded.git"
13 | },
14 | "scripts": {
15 | "test": "grunt test"
16 | },
17 | "keywords": [
18 | "angular",
19 | "preload",
20 | "preloaded"
21 | ],
22 | "author": "Gabriel Scholz ",
23 | "license": "MIT",
24 | "bugs": {
25 | "url": "https://github.com/garbles/angular-preloaded/issues"
26 | },
27 | "dependencies": {},
28 | "devDependencies": {
29 | "load-grunt-tasks": "~0.2.0",
30 | "karma": "~0.12.14",
31 | "karma-phantomjs-launcher": "~0.1.0",
32 | "karma-firefox-launcher": "~0.1.0",
33 | "karma-jasmine": "~0.1.5",
34 | "grunt": "~0.4.2",
35 | "grunt-contrib-uglify": "~0.2.2",
36 | "grunt-contrib-concat": "~0.3.0",
37 | "grunt-contrib-clean": "~0.5.0",
38 | "grunt-contrib-jshint": "~0.7.1",
39 | "grunt-contrib-watch": "~0.5.2",
40 | "jshint-stylish": "~0.1.3",
41 | "grunt-karma": "~0.8.2"
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/angular-preloaded.js:
--------------------------------------------------------------------------------
1 | (function(window, angular, undefined) {'use strict';
2 |
3 | angular.module('gs.preloaded', [])
4 | .directive('script', ['$preloaded', function ($preloaded) {
5 | return {
6 | restrict: 'E',
7 | link: function (scope, el, attrs) {
8 | var data;
9 |
10 | if (attrs.type !== 'text/preloaded') {
11 | return;
12 | }
13 |
14 | data = JSON.parse(el.text());
15 |
16 | if (attrs.hasOwnProperty('name')) {
17 | $preloaded[attrs.name] = data;
18 | } else {
19 | angular.extend($preloaded, data);
20 | }
21 | }
22 | };
23 | }])
24 |
25 | .value('$preloaded', {});
26 |
27 | })(window, window.angular);
28 |
--------------------------------------------------------------------------------
/test/angular-preloaded_spec.js:
--------------------------------------------------------------------------------
1 | describe('angular-preloaded', function () {
2 | beforeEach(function () {
3 | angular.module('FakeCtrl', [])
4 | .controller('FakeCtrl', function ($scope, $preloaded) {
5 | $scope.preloaded = $preloaded;
6 | });
7 |
8 | module('gs.preloaded', 'FakeCtrl');
9 | });
10 |
11 | var $scope;
12 |
13 | beforeEach(inject(function ($rootScope, $compile, $controller) {
14 | $scope = $rootScope.$new();
15 | $compile('')($rootScope);
16 | $compile('')($rootScope);
17 | $compile('')($rootScope);
18 | $compile('')($rootScope);
19 | $controller('FakeCtrl', { $scope: $scope });
20 | }));
21 |
22 | it('injects preloaded data to controllers', function () {
23 | expect($scope.preloaded).toEqual({a: 1, b: 2, c: { d: 3}, e: { f: 4 }});
24 | });
25 | });
26 |
--------------------------------------------------------------------------------