Estoy buscando la mejor manera de inicializar una matriz observable de algunos datos del servidor (ViewBag), y quiero que los contenidos de la matriz sean de un tipo javascript I ha definido. Sin el requisito del tipo JS tan sólo pudiera utilizar:Knockout JS inicializando una matriz observable de datos del servidor usando un tipo de Javascript
materialVarieties: ko.observableArray(@Html.Raw(Json.Encode(ViewBag.Materials)))
pero también tengo un tipo de material JS que quiero usar para que pueda tener algunas propiedades específicas ViewModel extra y funciones, es decir:
var material = function(id, name) {
this.id = id;
this.name = name;
this.selected = ko.observable(false);
this.select = function()
{
jQuery.each(processViewModel.materials(), function(index, item)
{
item.selected(false);
});
this.selected(true);
}
}
y entonces la inicialización necesaria se convierte en:
materialVarieties: ko.observableArray([new material(1, "Apricot"), .....
Actualmente construyo una cadena partir de los datos ViewBag y después de un procesamiento que como el inicializador de la siguiente manera:
@{ var items = string.Join(",",
((IEnumerable<MaterialVariety>) ViewBag.Materials)
.Select(m => string.Format("new material({0}, {1})",
Json.Encode(m.Id), Json.Encode(m.Name)))); }
var processViewModel = {
material: ko.observableArray([@Html.Raw(items)])
pero me pregunto si hay una manera más limpia que el bit string.Join
. Podría envolverlo en un Ayudante. ¿Qué haces?
¿Por qué no crear un método de extensión HtmlHelper? Tome un argumento genérico y devuelva la salida codificada. – Anuj
@Anuj Sí, eso es lo que estaba pensando ("Podría envolverlo en un Helper"), también tendría que tener una cadena que representara el tipo JS. El problema surge al calcular las propiedades para usar en el constructor JS (y la orden requerida). Puedo reflejar el argumento genérico para obtener las propiedades, pero esperaba usar mis Modelos del lado del servidor (no quiero otro conjunto de VM del lado del servidor) y tienen otras propiedades que no necesito en mi JS. Y eso todavía me deja el problema del orden del constructor ... ¿a menos que me falta algo? –