5

我正在努力返回 JSON 数据并将其转换为 observable。数据以 JSON 格式返回,但似乎没有分配给 observable。有人可以帮忙吗?我猜问题出在 ajax 调用的成功部分:

<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>
4

2 回答 2

12

您应该使用Knockout Mapping插件并将您的结果映射到 observable。

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

或者如果你的对象没有被 jQuery 自动解析

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

如果您的数据类型是数组,它将转换为 observableArray,因此要将其作为普通数组获取项目,您应该通过添加括号从任何其他可观察对象中获取;

var array = observableData();

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

self.standings(array);
于 2013-02-24T13:38:39.647 回答
1

使用 Knockout 映射插件的另一种选择是使用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));
});
于 2013-02-24T19:27:56.940 回答