Revealing Module Pattern with Angular

2.4k views Asked by At

Today code is driving me mad again especially the Angular with the Revealing Module Pattern in an Angular service. When I started I saw nothing wrong with it... now apart from not working... I don't know. Any way know I want to know if it's angular or me doing something stupid. here's the code:

angular.module('homeAdmin.services', [])
.factory('dataService', function ($http, $q) {
    'use strict';
    function _contentTypes(){
        var intialized = false;
        var _models = [];
        function _isReady() {
            return intialized;
        };
        return {
            isReady: _isReady
        };
    };

    return {
        contentTypes: _contentTypes
    };
});

And here's where it is called:

var contentTypeCtrl = ['$scope','$http','$window','dataService', function ($scope, $http, $window, dataService) {
'use strict';
$scope.isBusy = false;
$scope.data = dataService;
$scope.contentType = {};

$scope.name = 'Content Type';
$scope.init = function () {
    console.log('contentTypeCtrl initialized');
};

if (dataService.contentTypes.isReady() == false) {
    console.log("Hello let's load some data!"); 
}}]

And here's how firefox gives me the finger:

[16:01:56.864] "Error: dataService.contentTypes.isReady is not a function
contentTypeCtrl<@http://localhost:49499/App/plugins/home/admin/ngen/content-type-ctrl.js:12
invoke@http://localhost:49499/Scripts/angular/angular.js:2902
instantiate@http://localhost:49499/Scripts/angular/angular.js:2914
@http://localhost:49499/Scripts/angular/angular.js:4805
updateView@http://localhost:49499/Scripts/angular/angular-ui-router.js:1317
$ViewDirective/directive.compile/</eventHook@http://localhost:49499/Scripts/angular/angular-ui-router.js:1276
Scope.prototype.$broadcast@http://localhost:49499/Scripts/angular/angular.js:8307
$StateProvider/$get/transitionTo/$state.transition<@http://localhost:49499/Scripts/angular/angular-ui-router.js:1067
qFactory/defer/deferred.promise.then/wrappedCallback@http://localhost:49499/Scripts/angular/angular.js:6846
qFactory/ref/<.then/<@http://localhost:49499/Scripts/angular/angular.js:6883
Scope.prototype.$eval@http://localhost:49499/Scripts/angular/angular.js:8057
Scope.prototype.$digest@http://localhost:49499/Scripts/angular/angular.js:7922
Scope.prototype.$apply@http://localhost:49499/Scripts/angular/angular.js:8143
done@http://localhost:49499/Scripts/angular/angular.js:9170
completeRequest@http://localhost:49499/Scripts/angular/angular.js:9333
createHttpBackend/</xhr.onreadystatechange@http://localhost:49499/Scripts/angular/angular.js:9304"

Help? Anyone??

Here's an example how the isready function should be used:

    if (dataService.contentTypes.isReady() == false) {
    $scope.isBusy = true;
    dataService.contentTypes.get()
        .then(function () {
        }, function () {
            alert('contentTypes retrieval failed');
        })
        .then(function () {
            $scope.isBusy = false;
        });
}

And consume the data like this:

<tr data-ng-repeat="model in data.contentTypes.models">
2

There are 2 answers

2
user1566994 On BEST ANSWER

I'm not proficient with Angular, so excuse me if I'm way off here (-!

It looks like isReady() is returned by calling contentTypes() - but I don't see a call to contentTypes - only a reference, which points to the closure-fn _contentTypes.

Is it possible that this should read like below instead ?

dataService.contentTypes().isReady()

*added '()' to actually call the contentTypes function, which in turn will return the isReady() function

0
Steven Benjamin On

You can't use the Module Revealing Pattern with Factories, It will only return the default value of properties when instantiated. You need to use services if you want to use the modules revealing pattern.