knockOut用映射刷新数据绑定

时间:2013-09-17 22:56:58

标签: knockout.js

我有一个viewmodel,它有一个BatchHistoryViewModel类型的knockoutObservableArray

使用以下映射选项

在constuctor中成功创建
var mappingOptions = {
            'batchHistories': {
                create: function (options) {
                    return new BatchHistoryViewModel(options.data, dataContext);
                },
                key: function (batchHistory) {
                    return ko.utils.unwrapObservable(batchHistory.Id);
                }
            }

工作得很好,可观察数组在DOM上的表中正确显示

现在,当我尝试运行更新函数以从同一源获取相同的数据时,它不会更新DOM 我可以在控制台中观察observable并看到它正在使用正确的数据进行更新,但它没有在页面上更新

这是我的刷新功能

    refresh() {
        var self = this;

        $.when(self.dataContext.getBatchHistories(0, "Any"))
            .done(function (refreshedData) {
                var mappingOptions = {
                    'batchHistories': {
                        create: function (options) {
                            return new BatchHistoryViewModel(options.data, null);
                        },
                        key: function (batchHistory) {
                            return ko.utils.unwrapObservable(batchHistory.Id);
                        }
                    }
                };

                self = ko.mapping.fromJS(refreshedData, mappingOptions);

这是.net MVC控制器返回的内容

        var batchHistories =
            new
            {
                batchHistories =
                    this.consoleRepository.GetBatchHistories(fromDate, status).ToList()
                        .Select(batchHistory => new
                                                {
                                                    Id = batchHistory.Id,
                                                                            DataMartName = batchHistory.DataMartName,
                                                                            Name = batchHistory.Name,
                                                                            LoadType = batchHistory.LoadType,
                                                                            BatchDefinitionId = batchHistory.BatchDefinitionId,
                                                                            SsisExecutionId = batchHistory.SsisExecutionId,
                                                                            StatusId = batchHistory.StatusId,
                                                                            Status = batchHistory.Status.Status,
                                                                            StartDateTime = batchHistory.StartDateTime.SafeToString(),
                                                                            EndDateTime = batchHistory.EndDateTime.SafeToString(),
                                                })
                        .ToList()
            };


        return this.Json(batchHistories, JsonRequestBehavior.AllowGet);

我在fromJS上使用或不使用mapppingOptions尝试了它,我得到了相同的结果。

有什么想法吗?请询问更多代码是否有帮助。除非需要,否则我不想过多地重复这个问题。 谢谢!

1 个答案:

答案 0 :(得分:0)

我做错了这是应用映射的正确方法

 ko.mapping.fromJS(refreshedData, self );