user3918295
user3918295

Reputation: 365

breezejs Entity Framework angular

I am having issues getting the most recent version of the Breeze Angular client to query my Breeze service which is written with VS2013, EF6, and WebAPI2.

I have the service providing metadata and json to my endpoint(url); but, I seem to be having issues getting the dataservice.js file on the client setup correctly. Just injecting the service into the controller, fires off an undefined is not a function error.

My code is fairly close to the original example:

Am I missing something, it seems like Breeze is supposed to be simple to setup. Is there a working sample somewhere for EF6, BreezeAngular that is WebAPI2; but, not OData?

Thank you in advance

//////////////////////
//  dataservice.js  //
//////////////////////

/* dataservice: data access and model management layer 
 * relies on Angular injector to provide:
 *     $timeout - Angular equivalent of 'setTimeout'
 *     breeze - the Breeze.Angular service (which is breeze itself)
 *     logger - the application's logging facility
 */


(function() {

angular.module('app').factory('dataservice', ['$http', '$q', '$timeout', 'breeze', 'logger', dataservice]);

function dataservice( $http, $q, $timeout, breeze, logger) {

    var serviceName = 'breeze/userPortal'; // route to the same origin Web Api controller

    // *** Cross origin service example  ***
    // When data server and application server are in different origins
    //var serviceName = 'http://sampleservice.breezejs.com/api/todos/';

    var manager = new breeze.EntityManager(serviceName);
    manager.enableSaveQueuing(true);

    //REVEALING MODULE
    var service = {
        addPropertyChangeHandler: addPropertyChangeHandler,
        createuser: createuser,
        deleteuser: deleteuser,
        getusers: getusers,
        hasChanges: hasChanges,
        purge: purge,
        reset: reset,
        removePropertyChangeHandler: removePropertyChangeHandler,
        saveChanges: saveChanges
    };

    return service;

    /*** implementation details ***/

    function addPropertyChangeHandler(handler) {
        // Actually adds any 'entityChanged' event handler
        // call handler when an entity property of any entity changes
        return manager.entityChanged.subscribe(function(changeArgs) {
            var action = changeArgs.entityAction;
            if (action === breeze.EntityAction.PropertyChange) {
                handler(changeArgs);
            }
        });
    }

    function createuser(initialValues) {
        return manager.createEntity('user', initialValues);
    }

    function deleteuser(user) {
        user && user.entityAspect.setDeleted();
    }

    function getusers() {
        var query = breeze.EntityQuery
            .from("users")
            .orderBy("LastName");
    }

    var promise = manager.executeQuery(query).catch(queryFailed);
    return promise;

    function queryFailed(error) {
        logger.error(error.message, "Query failed");
        return $q.reject(error); // so downstream promise users know it failed
    }
});

function hasChanges() {
    return manager.hasChanges();
}

function handleSaveValidationError(error) {
    var message = "Not saved due to validation error";
    try { // fish out the first error
        var firstErr = error.entityErrors[0];
        message += ": " + firstErr.errorMessage;
    } catch (e) { /* eat it for now */ }
    return message;
}

function removePropertyChangeHandler(handler) {
    // Actually removes any 'entityChanged' event handler
    return manager.entityChanged.unsubscribe(handler);
}

function saveChanges() {
    return manager.saveChanges()
        .then(saveSucceeded)
        .catch(saveFailed);

    function saveSucceeded(saveResult) {
        logger.success("# of users saved = " + saveResult.entities.length);
        logger.log(saveResult);
    }

    function saveFailed(error) {
        var reason = error.message;
        var detail = error.detail;

        if (error.entityErrors) {
            reason = handleSaveValidationError(error);
        } else if (detail && detail.ExceptionType &&
            detail.ExceptionType.indexOf('OptimisticConcurrencyException') !== -1) {
            // Concurrency error 
            reason =
                "Another user, perhaps the server, " +
                "may have deleted one or all of the users." +
                " You may have to restart the app.";
        } else {
            reason = "Failed to save changes: " + reason +
                " You may have to restart the app.";
        }

        logger.error(error, reason);
        // DEMO ONLY: discard all pending changes
        // Let them see the error for a second before rejecting changes
        $timeout(function() {
            manager.rejectChanges();
        }, 1000);
        return $q.reject(error); // so downstream promise users know it failed
    }

}

//#region demo operations
function purge(callback) {
    return $http.post(serviceName + '/purge')
    .then(function () {
        logger.success("database purged.");
        manager.clear();
        if (callback) callback();
    })
    .catch(function (error) {
        logger.error("database purge failed: " + error);
        return $q.reject(error); // so downstream promise users know it failed
    });
}

function reset(callback) {
    return $http.post(serviceName + '/reset')
    .then(function () {
        logger.success("database reset.");
        manager.clear();
        if (callback) callback();
    })
    .catch(function (error) {
        logger.error("database reset failed: " + error);
        return $q.reject(error); // so downstream promise users know it failed
    });
}

//#endregion

Upvotes: 0

Views: 450

Answers (1)

Claies
Claies

Reputation: 22323

Your function is not structured properly. You terminated the dataservice function early, immediately before function hasChanges() {. this function, and all the functions declared after it, are no longer defined within dataservice.

Using the revealing module pattern, you attempt to assign service.hasChanges to the hasChanges function. But the hasChanges function is not defined inside dataservice, it is defined outside dataservice, so the assignment returns undefined, thus the error Undefined is not a function.

move the closing block of your dataservice function }); down to include all of it's functions.

Upvotes: 1

Related Questions