Reputation: 365
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
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