Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的viewModel更新为HTML而不是javascript?_Javascript_Knockout.js_Viewmodel - Fatal编程技术网

为什么我的viewModel更新为HTML而不是javascript?

为什么我的viewModel更新为HTML而不是javascript?,javascript,knockout.js,viewmodel,Javascript,Knockout.js,Viewmodel,我有一个函数,可以一次将行项目上移一行。为了简单起见,我展示了代码的一小部分。使用$root.cRecordID,我的observable在HTML中的显示与预期一致,但在我的代码中,它们是未定义的。这令人困惑和沮丧。有人能解释一下吗 listOrderUp: function (lid) { // get RecordID of selected item //viewModel.loadItemByID(lid); console.log(lid); ODa

我有一个函数,可以一次将行项目上移一行。为了简单起见,我展示了代码的一小部分。使用$root.cRecordID,我的observable在HTML中的显示与预期一致,但在我的代码中,它们是未定义的。这令人困惑和沮丧。有人能解释一下吗

listOrderUp: function (lid) {
    // get RecordID of selected item
    //viewModel.loadItemByID(lid);
    console.log(lid);

    OData.read(_serviceURL + "/nsLineItems(" + lid + ")?", function (response) {
        viewModel.cRecordID(response.RecordID);
        viewModel.cMenuID(response.MenuID);
        viewModel.cEntreeID(response.EntreeID);
        viewModel.cCategoryID(response.CategoryID);
        viewModel.cListOrder(response.ListOrder);
    });

    console.log(viewModel.cRecordID());

    // selected item - decrease ListOrder by 1
    var putdataCurrent = {
        RecordID: viewModel.cRecordID(),
        MenuID: viewModel.cMenuID(),
        CategoryID: viewModel.cCategoryID(),
        EntreeID: viewModel.cEntreeID(),
        ListOrder: viewModel.cListOrder() - 1
    };

    console.log(putdataCurrent);

    var _requestCurrent = {
        requestUri: _serviceURL + "/nsLineItems(" + viewModel.cListOrder() + ")",
        method: "MERGE",
        data: putdataCurrent
    };

    OData.request(_requestCurrent, function (data) {
    });
}
以下是控制台结果:

以下是我的html测试代码:

这将显示预期结果,但我需要代码中的结果,以便将数据保存到服务器。它怎么可以在代码(javascript文件)中未定义,但在html中正确显示?
谢谢,Jeff

我想,
OData.read(…)
是对服务器的异步调用吗?如果是这样,我相信您在
var putDataCurrent
中设置值的代码是在返回对服务器的调用之前执行的。如果在设置调用可观察对象的结果和设置
putDataCurrent
的位置放置两个断点,并检查哪个断点最先被击中。如果这是问题所在,您可以将代码移动到
OData.read的“success”回调中,或者您可以使用我通过将其余代码嵌入OData请求中获得了想要的结果:

listOrderUp: function (lid) {
    OData.read(_serviceURL + "/nsLineItems(" + lid + ")?", function (response) {
        viewModel.cRecordID(response.RecordID);
        viewModel.cMenuID(response.MenuID);
        viewModel.cEntreeID(response.EntreeID);
        viewModel.cCategoryID(response.CategoryID);
        viewModel.cListOrder(response.ListOrder);

        // selected item - decrease ListOrder by 1
        var putdataCurrent = {
            RecordID: viewModel.cRecordID(),
            MenuID: viewModel.cMenuID(),
            CategoryID: viewModel.cCategoryID(),
            EntreeID: viewModel.cEntreeID(),
            ListOrder: viewModel.cListOrder() - 1
        };

        console.log(putdataCurrent);

        var _requestCurrent = {
            requestUri: _serviceURL + "/nsLineItems(" + lid + ")",
            method: "MERGE",
            data: putdataCurrent
        };

        OData.request(_requestCurrent, function (data) {
        });
    });
    console.log(viewModel.cRecordID());
}