javascript - 单击按钮时 Knockout.js 更新 ViewModel

标签 javascript jquery mvvm knockout.js

嗯,这不是最好的情况描述...无论如何,我正在尝试更新我的 ViewModel,但它不起作用。默认情况下,我从 Controller 函数获取数据并通过单击按钮 - 从同一 Controller 中的另一个函数获取数据,但 ViewModel 仅包含在第一次 ViewModel 初始化后收到的数据。

<script>
     function viewModel () {
        var self = this;
        self.currentPage = ko.observable();
        self.pageSize = ko.observable(10);
        self.currentPageIndex = ko.observable(0);
        self.salesdata = ko.observableArray();
        self.newdata = ko.observable();
        self.currentPage = ko.computed(function () {
            var pagesize = parseInt(self.pageSize(), 10),
            startIndex = pagesize * self.currentPageIndex(),
            endIndex = startIndex + pagesize;
            return self.salesdata.slice(startIndex, endIndex);
        });
        self.nextPage = function () {
            if (((self.currentPageIndex() + 1) * self.pageSize()) < self.salesdata().length) {
                self.currentPageIndex(self.currentPageIndex() + 1);
            }
            else {
                self.currentPageIndex(0);
            }
        }
        self.previousPage = function () {
            if (self.currentPageIndex() > 0) {
                self.currentPageIndex(self.currentPageIndex() - 1);
            }
            else {
                self.currentPageIndex((Math.ceil(self.salesdata().length / self.pageSize())) - 1);
            }
        }
        //Here I'm trying to update ViewModel
        self.request = function (uri) {
            $.ajax({
                url: uri,
                contentType: 'application/json',
                data: [],
                type: 'GET',
                cache: false,
            success: function (data) {
                ko.mapping.fromJS(data.$values, {}, self.salesdata);
            }
            });
        }
    }
    $(document).ready(function () {
        $.ajax({
            url: "/api/sales",
            type: "GET",
            cache: false,
        }).done(function (data) {
            var vm = new viewModel();
            vm.salesdata(data.$values);
            ko.applyBindings(vm);
        }).error(function (xhr, status, error) {
            var err = eval("(" + xhr.responseText + ")");
            alert(err.Message);
        });
        //Here i'm calling for ViewModel update
        $(".btn-default").click(function () {
            days = $(this).val();
            var uri = "/api/sales?days=" + days;     
            new viewModel().request(uri);
        });
    });
</script>

更新。 我更改了获取新数据的代码块,如下所示:

self.request = function (uri) {
                $.getJSON(uri, function (data) {
                    ko.mapping.fromJS(data.$values, {}, viewModel);
                });
            }

不幸的是,这也不起作用。这里没有任何 JS 错误, Controller 返回更新数据的适当部分。

最佳答案

我对所有这些都不熟悉,但如果我正确阅读了您的代码,那么您是在 View 模型的新实例上调用请求函数,而不是绑定(bind)到 html 文档的实例。您需要在初始 get 调用完成后对您创建的 View 模型进行请求调用。

更新: 抱歉,我应该更具体地说明我所指的代码。在代码块的末尾,您有以下代码:

    $(".btn-default").click(function () {
        days = $(this).val();
        var uri = "/api/sales?days=" + days;     
        new viewModel().request(uri);
    });

在这段代码中,似乎每次单击默认按钮时,都会创建一个新的 View 模型,并在该 View 模型上调用请求函数。

在定义加载销售数据后发生的事情的文档就绪函数中,您有以下代码,它创建了 html 文档实际绑定(bind)到的 View 模型:

    var vm = new viewModel();
    vm.salesdata(data.$values);
    ko.applyBindings(vm);

在这个 View 模型上没有任何东西调用请求函数。我想知道您是否真正想要以某种方式将此 View 模型中的请求函数绑定(bind)到默认按钮。

关于javascript - 单击按钮时 Knockout.js 更新 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23293378/

相关文章:

javascript - React dangerouslySetInnerHTML 只有在 div 标签上使用时才能正常工作

jquery - 尝试使用 CSS 和 JQUERY 使多个背景图像在幻灯片中循环

c# - 在方法中更改文本框颜色

javascript - Spring Boot 无法为对象返回 JSON,但不能为对象列表返回 JSON

javascript - 在屏幕的给定坐标处显示 JqueryUI 对话框

javascript - 显示来自输入类型文件的文件名 - console.log(fileName) 返回 null

silverlight - 在 Silverlight NumericUpDown 更改值之前触发 MVVM 中继命令

c# - 使用 LINQ 获取 1-2-3 分数并将其绑定(bind)到 View

javascript - Chart.js - Moment.js 找不到!您必须将其包含在 Chart.js 之前才能使用时间刻度

javascript - 自动输入文本输入