2010-08-31 14 views

Respuesta

3

Estoy buscando lo mismo. Parece escaso. El que me pareció más prometedor es persistence.js. Impel también se ve bien pero, desafortunadamente, parece que no se ha actualizado en un año y medio. ActiveRecord.js podría terminar funcionando, pero aún no parece que soporten Web SQL. Con suerte, alguien publicará más opciones.

+0

persistence.js lo es. – bennedich

1

También estoy buscando lo mismo. JazzRecord parece un posible candidato.

7

Hay una nueva llamada JayData library, esta es como EntityFramework (o NHibernate) para la plataforma JavaScript: proporciona JavaScript Language Query (JSLQ) y JavaScript CRUD. También admite definiciones de modelo, propiedades de navegación y relaciones 1..1.0, 1..m, m..n.

copio un corto codesnippet sobre cómo usarlo:

//define storage model: Department and Employee in a 1..m relation 

$data.Entity.extend("$org.types.Department", { 
    Id: { type: "int", key: true, computed: true }, 
    Name: { type: "string", required: true }, 
    Address: { type: "string" }, 
    Employees: { type: "Array", elementType: "$org.types.Employee", inverseProperty:"Department" } 
}); 


$data.Entity.extend("$org.types.Employee", { 
    Id: { type: "int", key: true, computed: true }, 
    FirstName: { type: "string", required: true }, 
    LastName: { type: "string", required: true }, 
    Department: { type: "$org.types.Department", inverseProperty:"Employees"} 
}); 

$data.EntityContext.extend("$org.types.OrgContext", { 
    Department: { type: $data.EntitySet, elementType: $org.types.Department }, 
    Employee: { type: $data.EntitySet, elementType: $org.types.Employee } 
}); 

Puede codificar en contra de la OrdContext y las colecciones en el mismo. La siguiente línea creará una instancia de contexto que está respaldado por WebSQL local (usted tiene otras opciones como IndexedDB o OData)

var context = new $org.types.OrgContext({ name: "webSql", databaseName: "OrgDB" }); 

Añadir algunos datos

var department = new $org.types.Department({ Name: 'Finance', Employees: [] }); 

var emp1 = new $org.types.Employee({ FirstName: 'John', LastName: 'Smith'}); 
department.Employees.push(emp1); 

var emp2 = new $org.types.Employee({ FirstName: 'Jane', LastName: 'Smith'}); 
emp2.Department = department; 

context.add(department); 
context.add(emp2); 

context.saveChanges(); 

Ahora que tiene los datos del almacén se puede consultarlo. Las consultas JSLQ son compatibles con los campos de entidad, más los campos de navegación que apuntan en la dirección m..1. (En la versión 1.0 se puede no directamente contra navProperties 1..m. Puedes evitar esto con la expresión in

//filter 
context.Employees 
    .filter(function(emp) { return emp.LastName == 'Smith' }) 
    .toArray(...); 

//filter 
context.Employees 
    .filter(function(emp) { return emp.FirstName.startsWith('J') || 
            emp.LastName.toLowerCase.contains('mith') }) 
    .toArray(...); 

//filter2 
context.Employees 
    .filter(function(emp) { return emp.Department.Id == 1 }) 
    .toArray(function(emps) { }); 

//filter2 + eager load 
context.Employees 
    .include("Department") 
    .filter(function(emp) { return emp.Department.Id == 1 }) 
    .toArray(function(emps) { }); 


//map/project 
context.Employees 
    .filter(function(emp) { return emp.Department.Id == 1 }).toArray(...) 
    .map(function(emp) { return { EmployeeName: emp.FirstName + emp.LastName, 
           DepartmentName: emp.Department.Name }}) 
    .forEach(function(item) { ... }) 
Cuestiones relacionadas