2012-03-16 11 views
18

questo mi imbarazza. deve essere qualcosa di piccolo che non vedo. Sto cercando di caricare un semplice observableArray in knockout con una chiamata Ajax.caricando un knockout.js observableArray() da .ajax() chiama

javascript

// we bind the array to the view model property with an empty array. 
var data = []; 
var viewModel = { 
    vendors: ko.observableArray(data) 
}; 
ko.applyBindings(viewModel); 

$(function() { 
    // on this click event, we popular the observable array 
    $('#load').click(function() { 
     // WORKS. Html is updated appropriately. 
     viewModel.vendors([{ "Id": "01" },{ "Id": "02" },{ "Id": "03" }]); 

     // DOES NOT WORK. Fiddler2 shows the same exact json string come back 
     // as in the example above, and the success function is being called. 
     $.ajax({ 
      url: '/vendors/10', 
      dataType: 'json', 
      success: function (data) { 
       viewModel.vendors(data); 
      } 
     }); 
    }); 
}); 

html

<button id="load">Load</button> 
<ul data-bind="template: { foreach: vendors }"> 
    <li><span data-bind="text: Id"></span></li> 
</ul> 

Domanda: Perché la chiamata ajax di successo, che è data valore della variabile corrisponde byte per byte del disco valore digitato, non attivare la h tml aggiorna?

risposta

11

Non c'è motivo per cui questo non funzionerebbe correttamente. Come questo dimostra.

http://jsfiddle.net/madcapnmckay/EYueU/

vorrei controllare che il post Ajax è in realtà tornando dati JSON e JSON che che è un array e che è in fase analizzata correttamente.

Ho dovuto modificare la chiamata ajax per far funzionare correttamente i manipolatori ajax.

Niente di più a cui riesco a pensare.

Spero che questo aiuti.

+0

grazie per aver convalidato la mia sanità mentale ... guarderò più da vicino. forse MVC succhia in un piccolo involucro o qualcosa del genere ... –

+0

Yeh. Firebug la risposta della richiesta, verifica che stai ricevendo JSON e quindi verifica che jquery la analizzi su un oggetto. – madcapnmckay

+0

è json per certo ... il codice C# assomiglia a 'return Json (list, JsonResponseBehavior.AllowGet);' dove 'list' è un ICollection ' quindi so che è JSON. Aggiungete a ciò, che Fiddler2 mostra correttamente i dati nella sua vista JSON ... è in javascript da qualche parte. posterò di nuovo domani con più informazioni quando sono al lavoro –

-3

Si tratta di bug credo, campione di Knockout sta funzionando quando l'usiamo con classe wrapper:

public class ResultWrapper 
{ 
    public Title {get;set;} 
    public List<Result> {get;set;} 
} 

http://learn.knockoutjs.com/#/?tutorial=webmail

Ma se torniamo Risultati direttamente non c'è modo per legare esso. (Senza applyBindings extra!)

0
var self=this; 
//var self first line in model 

$.ajax({ 
      url: ", 
      dataType: "json", 
      contentType: 'application/json', 
      type: "POST", 
      data: JSON.stringify({ }), 
      processdata: true, 

      beforeSend: function() { 
       $.mobile.loading('show'); 
      }, 

      error: function (xhr, textStatus, errorThrown) { 
       alert('Sorry!'); 
      }, 

      success: function (data) { 

       $.mobile.loading('hide'); 
       if (data.result!= '') { 
        self.vendors(data.result); 



       } else { 
        self.vendors({something}); 

       } 
      } 
     }); 

Utilizzare self.vendors non questo viewModel.vendors

-2

Sono troppo tardi in questo dato mi sono trovato bloccato in questa situazione proprio di recente. Possiamo usare una semplice funzione di Javascript come soluzione.

Invece di viewModel.vendors(data);, possiamo usare

eval("viewModel.vendors("+JSON.stringify(data)+");");... 

Ha funzionato per me.

0

Ecco cosa ho fatto nella mia app MVC .net con knockout e jquery.

// Scripts/groItems.js 
 
(function() { 
 

 
    var ViewModel = function() { 
 
     items = ko.observableArray(), 
 
      ItemName = ko.observable(), 
 
      Img = ko.observable(), 
 
      Qty = ko.observable() 
 
    } 
 

 
    $.getJSON('/Items2/AllItems', function (data) { 
 
     for (var i = 0; i < data.length; i++) { 
 
      self.items.push(data[i]); 
 
     } 
 
    }); 
 

 
    var vm = new ViewModel(); 
 

 
    $(function() { 
 
     ko.applyBindings(vm); 
 
    }); 
 

 
}());
@model IEnumerable<GroModel.Item> 
 
@{ 
 
    ViewBag.Title = "Index"; 
 
} 
 

 
<p> 
 
    @Html.ActionLink("Create New", "Create") 
 
</p> 
 

 
<div data-bind="text: items().length"></div> 
 
<table class="container table table-hover"> 
 
    <thead> 
 
     <tr> 
 
      <th>Item name</th> 
 
      <th>img</th> 
 
      <th>qty</th> 
 
     </tr> 
 
    </thead> 
 
    <tbody data-bind="foreach: items"> 
 
     <tr> 
 
      <td data-bind="text: ItemName"></td> 
 
      <td data-bind="text: Img"></td> 
 
      <td data-bind="text: Qty"></td> 
 
     </tr> 
 
    </tbody> 
 
</table> 
 

 
@section Scripts { 
 
    <script src="~/Scripts/knockout-3.4.2.js"></script> 
 
    <script src="~/Scripts/groItems.js"></script> 
 
}

seguito fa parte del mio codice al Items2Controller.cs

private GroContext db = new GroContext(); 
    public JsonResult AllItems() 
    { 
     return Json(db.Items.ToList(), JsonRequestBehavior.AllowGet); 
    } 

enter image description here

Spero che questo vi aiuterà. Grazie

Problemi correlati