Ho iniziato con l'asciugamano caldo SPA, ma abbiamo usato altri riferimenti come il campione Durandal MovieApp che potete trovare qui. http://stephenwalther.com/archive/2013/02/08/using-durandal-to-create-single-page-apps.aspx. ho anche scaricato e rivisto il runtime breezejs che comprendeva i campioni.
Nel mio scenario ho utilizzato un SQL con Entity Frameworks e creato un controller WEBAPI e seguito la documentazione di breezejs. un eccetto il mio controller è sotto.
[BreezeController]
public class ProjectBillingController : ApiController
{
readonly EFContextProvider<ProjectBillingContext> _contextProvider =
new EFContextProvider<ProjectBillingContext>();
// ~/api/todos/Metadata
[HttpGet]
public string Metadata()
{
return _contextProvider.Metadata();
}
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
return _contextProvider.SaveChanges(saveBundle);
}
[HttpGet]
public IQueryable<Client> Clients()
{
return _contextProvider.Context.Clients;
}
...
Ho poi cercato di imitare la struttura di directory di codice & del Durandal film APP
/App
/App/respositories
/App/repositories/repository.js
/App/viewmodels
/App/viewmodels/clients
/App/viewmodels/clients/show.js
/App/viewmodels/clients/edit.js
/App/viewmodels/clients/create.js
/App/views/clients
/App/views/clients/show.html
/App/views/clients/edit.html
/App/views/clients/create.html
Nel mio caso ho usato un unico repository, perché non era qualsiasi query complesse, anche se per me la sua una inizio.
ma all'interno del mio repository ho definito il gestore di entità breezejs e alcune funzioni per recuperare tutte le righe e 1 riga. un estratto del codice è sotto,
// repository.js
function getRecordLists(modelsListsObservable, errorObservable, entity) {
return breeze.EntityQuery
.from(entity)
.using(manager).execute()
.then(querySucceeded)
.fail(queryFailed);
function querySucceeded(data) {
modelsListsObservable(data.results);
logger.log('Fetched ' + entity, null, null, true);
}
function queryFailed(error) {
errorObservable("Error retrieving" + entity + " : " + error.message);
logger.error("Error retrieving" + entity + " : " + error.message, null, null, true);
}
};
function getRecord(id, clientObservable, errorObservable, entity, entityKey) {
return breeze.EntityQuery.from(entity)
.where(entityKey, "==", id)
.using(manager).execute()
.then(querySucceeded)
.fail(queryFailed);
function querySucceeded(data) {
clientObservable(data.results[0]);
logger.log('Fetched a record from ' + entity, null, null, true);
}
function queryFailed(error) {
errorObservable("Error retrieving a record from " + entity + ": " + error.message);
logger.error("Error retrieving a record from " + entity + ": " + error.message, null, null, true);
}
};
// show.js
define(function (require) {
var repository = require("repositories/repository");
var app = require('durandal/app');
var router = require("durandal/plugins/router");
var logger = require('services/logger');
var models = ko.observableArray();
var error = ko.observable();
return {
models: models,
error: error,
deleteRecord: deleteRecord,
activate: function (data) {
return repository.getRecordLists(models, error, "Resources");
}
};
Spero che questo ti aiuti un po '. Anche io sto imparando questo e alcune cose potrebbero non essere le migliori pratiche, ma è abbastanza buona per me da cui imparare.
grazie
Sono nella stessa barca e si sentono esattamente come avete fatto ... Ci sembra essere tanti modi per fare queste cose ora, che è difficile puntare in una direzione e andare avanti. –