├── .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 | [![Build Status](https://secure.travis-ci.org/garbles/angular-preloaded.png?branch=master)](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 | --------------------------------------------------------------------------------