Javascript 未捕获类型错误:无法读取属性';fromJSON';未定义的

Javascript 未捕获类型错误:无法读取属性';fromJSON';未定义的,javascript,jquery,ajax,knockout.js,Javascript,Jquery,Ajax,Knockout.js,我试图在ajax调用从以下页面返回后显示菜单数据: <head> <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.min.css"> <script type='text/javascript' src="https://cdnjs.clo

我试图在ajax调用从以下页面返回后显示菜单数据:

<head>
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.min.css">

    <script type='text/javascript' src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.1/knockout-min.js"></script>
    <script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script>
    <!-- <script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/js/bootstrap.min.js'></script>
    <script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.js'></script> -->
</head>


<body>

    <h1>page loaded</h1>

    <div data-bind="foreach: menu">
        <!-- ko foreach: items -->
            <span data-bind="$data.name"></span>
        <!-- /ko -->
    </div>
</body>




<script>

    function OrderPageViewModel() {
        var self = this;

        // self.menu_loaded_success_callback = function(data) {
        //         var retrieved_menu = data["menu"];
        //         self.menu = ko.observable(retrieved_menu);
        //         console.log(retrieved_menu)
        //         alert(data);
        //     }
        //
        // self.get_data(menu_url).done(self.menu_loaded_success_callback);

    }

    var menu_url = "menu/get-menu";

    get_menu_data = function(url_ending){
        console.log("running get_data");
        var URL = "/api/&/".replace("&", url_ending);
        console.log("URL: ", URL);
        return $.ajax({
            dataType: "json",
            url: URL,
            // type: "GET",
        });
    }

    get_menu_data(menu_url).done(function(data){
        var vm = new OrderPageViewModel();
        console.log(data);
        vm = ko.mapping.fromJSON(data);
        ko.applyBindings(vm);
    }).fail(function(){
        alert("failed");
    });

    // ko.applyBindings(new OrderPageViewModel());

</script>

页面加载
函数OrderPageViewModel(){
var self=这个;
//self.menu\u loaded\u success\u callback=函数(数据){
//检索的var_menu=数据[“menu”];
//self.menu=ko.observable(检索到的菜单);
//console.log(检索的菜单)
//警报(数据);
//     }
//
//self.get\u data(menu\u url).done(self.menu\u loaded\u success\u callback);
}
var menu_url=“菜单/获取菜单”;
获取菜单数据=函数(url\u结束){
log(“运行get_数据”);
var URL=“/api/&/”。替换(“&”,URL_结尾);
log(“URL:,URL”);
返回$.ajax({
数据类型:“json”,
url:url,
//键入:“获取”,
});
}
获取菜单数据(菜单url).完成(函数(数据){
var vm=新的OrderPageViewModel();
控制台日志(数据);
vm=ko.mapping.fromJSON(数据);
ko.应用绑定(vm);
}).fail(函数(){
警报(“失败”);
});
//应用绑定(新的OrderPageViewModel());


我遵循了上的示例,它说的是
uncaughttypeerror:cannotread属性'fromJSON'的undefined

fromJSON
方法是其中的一部分,不包含在代码敲除库中

您必须单独包含映射插件,因此在包含knockout之后添加以下行:

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js" type='text/javascript'></script>

fromJSON的
方法是其中的一部分,不包含在代码淘汰库中

您必须单独包含映射插件,因此在包含knockout之后添加以下行:

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js" type='text/javascript'></script>