0

I've recently started to use angularjs and have found it great so far. I've decided to use it on a new project and would like to have a one page application.

My idea was to have a controller per "page", using a menuController to show/hide the controllers, so only one is ever visible at a time.

With a bit of experimentation, I've coded this:

var StoresAdminModule = angular.module("StoresAdminModule", []);

StoresAdminModule.service("pageStateService", function () {

    var observerCallbacks = [];

    //register an observer
    this.registerObserverCallback = function (callback) {
        observerCallbacks.push(callback);
    };

    //call this when you know 'foo' has been changed
    this.notifyObservers = function () {
        angular.forEach(observerCallbacks, function (callback) {
            callback();
        });
    };

    var pageState = {};

    pageState.Pages = [];
    pageState.Pages["HomeController"] = true;
    pageState.Pages["CategoryController"] = false;

    this.showPage = function (controller) {

        for (var key in pageState.Pages) {
            pageState.Pages[key] = false;
        }

        pageState.Pages[controller] = true;
        return false;
    };

    this.getState = function (controller) {

        return pageState.Pages[controller];
    };
});

StoresAdminModule.controller("HomeController", function ($scope, pageStateService) {
    var message = {};
    message.Welcome = "Just Testing Home!";
    $scope.message = message;

    var updateFoo = function() {
        $scope.show = pageStateService.getState("HomeController");
    };


    pageStateService.registerObserverCallback(updateFoo);
});

StoresAdminModule.controller("CategoryController", function ($scope, pageStateService) {

    var message = {};
    message.Welcome = "Just Testing Category!";
    $scope.message = message;

    var updateFoo = function () {
        $scope.show = pageStateService.getState("CategoryController");
    };

    pageStateService.registerObserverCallback(updateFoo);
});


StoresAdminModule.controller("MenuController", function ($scope, pageStateService) {

    $scope.doStuff = function(page)
    {
        pageStateService.showPage(page);
        pageStateService.notifyObservers();
    };
});

<div ng-app="StoresAdminModule">
    <div ng-controller="MenuController">
        <button ng-click="doStuff('HomeController')">Home</button> <button ng-click="doStuff('CategoryController')">Categorys</button>
    </div>
    <div ng-controller="HomeController" ng-show="show">
        <p ng-bind="message.Welcome"></p>
    </div>
    <div ng-controller="CategoryController" ng-show="show">
        <p ng-bind="message.Welcome"></p>
    </div>
</div>

It uses a service to maintain page show/hide state and the observer pattern to push notifications to a variable in each page controller to change a show bool.

Is there anything fundamentally wrong with doing it this way? As I'm new to angular, I might be missing something.

Is there an easier way to do this?

I want to check everything is ok before pushing ahead and using such a pattern in production.

2

1 Answer 1

2

You can do this by

angular.module('StoresAdminModule', [])
    .config(['$routeProvider', '$httpProvider', function ($routeProvider, $httpProvider) {
        $routeProvider
            .when('/menulink', { templateUrl: 'YourPage.html', controller: 'HomeController' })
            .when('/menulink1', { templateUrl: 'YourPage.html', controller: 'CategoryController' })
            .otherwise({ redirectTo: '/' });

        //initialize get if not there      
    }])

More details

http://scotch.io/tutorials/javascript/single-page-apps-with-angularjs-routing-and-templating

http://www.codeproject.com/Articles/686880/AngularJS-Single-Page-Application-with-WebAPI-and

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for all the answers. I should have done a bit more research first it seems!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.