2013-02-24 91 views
3

我很努力地返回JSON数据并将其转换为可观察对象。数据以JSON格式正常返回,但似乎没有分配给observable。任何人都可以帮忙吗?我猜问题是在Ajax调用的成功部分:将Knockout js json转换为可观察的

<script type="text/javascript"> 

function StandingsViewModel() { 
    var self = this; 

    self.standings = ko.observableArray(); 

    self.DivisionName = ko.observable(''); 

    self.afceast = ko.computed(function() { 

     return ko.utils.arrayFilter(self.standings(), function (i) { 
      return "AFC East" == i.DivisionName; 
     }); 
    }); 

    self.afccentral = ko.computed(function() { 

     return ko.utils.arrayFilter(self.standings(), function (i) { 
      return "AFC Central" == i.DivisionName; 
     }); 
    }); 

    self.afcwest = ko.computed(function() { 

     return ko.utils.arrayFilter(self.standings(), function (i) { 
      return "AFC West" == i.DivisionName; 
     }); 
    }); 

    self.nfceast = ko.computed(function() { 

     return ko.utils.arrayFilter(self.standings(), function (i) { 
      return "NFC East" == i.DivisionName; 
     }); 
    }); 

    self.nfccentral = ko.computed(function() { 

     return ko.utils.arrayFilter(self.standings(), function (i) { 
      return "NFC Central" == i.DivisionName; 
     }); 
    }); 

    self.nfcwest = ko.computed(function() { 

     return ko.utils.arrayFilter(self.standings(), function (i) { 
      return "NFC West" == i.DivisionName; 
     }); 
    }); 

    $.ajax({ 
     dataType: "json", 
     url: "/api/standing/GetStandingsBySeason/2018", 
     beforeSend: function (xhr) { 
      $('#divStandings').html(''); 
      $('#divStandings').addClass('ajaxRefreshing'); 
      xhr.setRequestHeader('X-Client', 'jQuery'); 
     }, 
     success: function (result) { 
      $('#divStandings').removeClass('ajaxRefreshing'); 
      self.standings(JSON.parse(result)); 
     } 
    }); 
} 

$(document).ready(function() { 
    ko.applyBindings(new StandingsViewModel()); 
}); 

</script> 

回答

9

您应该使用Knockout Mapping插件,你的结果映射到可观察的。

var observableData = ko.mapping.fromJS(result); 

,或者如果你的对象没有被jQuery的

var observableData = ko.mapping.fromJSON(result); 

自动解析如果你的数据类型是数组这将是转换器observableArray,所以获得它的项目,如正常的数组,你应该得到像从任何其他可观察到的加入括号;

var array = observableData(); 

该数组可以通过分配给您的obsevableArray以这种方式:

self.standings(array); 
+0

没有得到这个工作,警报(observableResult)给出了这样的:函数c(){如果(0 <的arguments.length){如果(! c.equalityComparer ||!c.equalityComparer(d,arguments [0]))cI(),d = arguments [0],cH(); return this} aULa(c); return d}。我需要其他参考吗? – user517406 2013-02-24 15:59:52

+0

'observableResult()'的结果是什么?你确定'result'还没有被解析吗? – 2013-02-24 16:16:30

+0

alert(observableResult())给出null – user517406 2013-02-24 16:21:22

1

另外一种方式来使用淘汰赛映射插件是使用Knockback。它是Knockout和Backbone之间的桥梁。

您可以轻松地让您的数据,像这样:

//Model 
var StandingsModel = Backbone.Collection.extend({ 
    url:'/api/standing/GetStandingsBySeason/2018' 
}); 

//View model 
var StandingsViewModel = function (standings) { 
    this.standings = kb.collectionObservable(standings) 
    //... 
}; 

$(document).ready(function() { 
    //Get data from server 
    var model = new StandingsModel(); 
    model.fetch(function() { 
     success: //... 
    }); 

    //Apply bindings 
    ko.applyBindings(new StandingsViewModel(model)); 
});