Tengo el siguiente código y parece que no está llamando al cliente y actualizando el modelo de vista KnockOutJS con la información. Se llama al GetOuting() en la carga de la página y se introduce la información correcta en el modelo de vista. Chrome no muestra errores JS en las herramientas de desarrollador. A partir de ese momento, tengo problemas para encontrar la forma de solucionarlo. Cualquier ayuda es apreciada. SignalR HubIntentando implementar SignalR con Knockout ViewModel
public class Outings : Hub
{
private static Dictionary<Guid, OutingViewModel> outings = new Dictionary<Guid, OutingViewModel>();
public void GetOuting(string id)
{
var guidID = new Guid(id);
bool containsOuting = outings.ContainsKey(guidID);
if (!containsOuting)
{
var outingAccessor = new OutingAccessor();
outingAccessor.ID = guidID;
outingAccessor.Load();
var outingVM = new OutingViewModel(outingAccessor);
outings.Add(guidID, outingVM);
}
var outing = outings[guidID];
this.Clients.updateOuting(outing);
}
public void SaveOuting(string outingNumber, OutingViewModel outing)
{
var guidID = new Guid(outingNumber);
outings[guidID] = outing;
this.Clients.updateOuting(outing);
}
}
modelo de vista
public class OutingViewModel
{
public OutingViewModel(OutingAccessor outingAccessor)
{
ID = outingAccessor.ID;
OutingNumber = outingAccessor.OutingNumber;
var outingGeneralAccessor = new OutingGeneralAccessor();
var outingGeneral = outingGeneralAccessor.GetOutingGeneralByOutingID(outingAccessor.ID);
this.OutingName = outingGeneral.Name;
}
public Guid ID { get; set; }
public int OutingNumber { get; set; }
public string OutingName { get; set; }
}
HTML + JavaScript
@model string
<script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"> </script>
<script src="@this.Url.Content("~/Scripts/jquery.signalR.js")" type="text/javascript"> </script>
<script src="@this.Url.Content("~/Scripts/knockout.js")" type="text/javascript"> </script>
<script type="text/javascript" src="/signalr/hubs"> </script>
<script type="text/javascript">
$(function() {
function outingDataViewModel() {
this.hub = $.connection.outings;
this.ID = ko.observable();
this.OutingNumber = ko.observable();
this.OutingName = ko.observable();
//Initializes the view model
this.init = function() {
this.hub.getOuting('@this.Model');
};
this.hub.updateOuting = function(data) {
ID(data.ID);
OutingName(data.OutingName);
OutingNumber(data.OutingNumber);
};
}
var vm = new outingDataViewModel();
ko.applyBindings(vm);
// Start the connection
$.connection.hub.start(function() { vm.init(); });
});
</script>
<h1>Outing Number</h1>
<div id="OutingSummary">
<div data-bind="text:OutingNumber"></div>
<div data-bind="text:OutingName"></div>
</div>
Tras una posterior depuración que parece estar en las líneas
ID(data.ID);
OutingName(data.OutingName);
OutingNumber(data.OutingNumber);
Se loo Como me sale una excepción de "undefined_method" cuando intenta establecer ID. ¿Eso tiene sentido para alguien más?
¿No necesita hacer referencia a jQuery antes del golpe de gracia? –
Solo necesita jQuery si usa plantillas jQery con KnockoutJS, de lo contrario KnockoutJS no tiene dependencias. –
Buena captura, pero esto es en realidad una vista parcial y la vista maestra contiene la referencia jquery. Agregué la referencia de jquery en el fragmento de código para no generar ninguna respuesta positiva falsa ... tanto por ese pensamiento. Arreglaré el ejemplo en breve. – PlTaylor