【问题标题】:Knockoutjs mapping is not bindingKnockoutjs 映射不绑定
【发布时间】:2013-11-14 23:09:24
【问题描述】:

我想第一次使用 KnockoutJS 映射插件,因为它可以为我节省大量代码。但是尽管对象被映射,它并没有绑定到视图。我的代码如下:

JavaScript

...
//global variables
var mv;
...
function viewmodel() {
    var self = this;

    self.searchViewModel = ko.mapping.fromJS({});
}
...
//load function
$().ready(function () {
    mv = new viewmodel();
    doSearch();
    ko.applyBindings(mv);
...
}
function doSearch() {
    var params = "{'_search':'" + JSON.stringify(searchObject) + "'}";
    $("#_pnlMachineList").mask("Loading...");

    $.ajax({
        type: "POST",
        url: "machinepark2.aspx/doSearch",
        data: params,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        dataFilter: function(data) {
            // This boils the response string down 
            //  into a proper JavaScript Object().
            var msg = eval('(' + data + ')');

            // If the response has a ".d" top-level property,
            //  return what's below that instead.
            if (msg.hasOwnProperty('d'))
                return msg.d;
            else
                return msg;
        },
        success: function (msg) {
            ko.mapping.fromJS(msg, {}, mv.searchViewModel);
        },
        error: function (msg) {
            //document.location = "/errorPage.aspx";
        }
    });
}

HTML

Count: <span data-bind="text: searchViewModel.searchCount"></span>
<br />
<table class="table">
    <thead>
        <tr class="text_bold">
            <th>Name</th>
            <th>Type</th>
            <th>Model</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: searchViewModel.machines">
        <tr style="cursor:pointer;" data-bind="attr: { 'data-guid': GUID }, click: loadmachine">
            <td data-bind="text: EndUserMachineName"></td>
            <td><img alt="" style="position: relative;" data-bind="attr: { src: TypeImage }"></td>
            <td data-bind="html: ManufacturerModel"></td>
        </tr>
    </tbody>
</table>

doSearch 函数执行完毕后,我可以在 firebug 控制台中查看 mv.searchViewModel。所有属性都很好地放入可观察对象中:

mv.searchViewModel.searchCount() 给了我一个整数:2。

但是计数标签和表格没有填满。我做错了什么?

编辑:Firebug 没有给出任何错误。

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    你大多在 searchViewModel 之后忘记了一些 ()。这是更正后的代码(小提琴:http://jsfiddle.net/hv9Dx/7/):

    html:

    Count: <span data-bind="text: searchViewModel().searchCount"></span>
    <br />
    <table class="table">
        <thead>
            <tr class="text_bold">
                <th>Name</th>
                <th>Type</th>
                <th>Model</th>
            </tr>
        </thead>    
        <tbody data-bind="foreach: searchViewModel().machines">
            <tr style="cursor:pointer;" data-bind="attr: { 'data-guid': GUID }">
                <td data-bind="text: EndUserMachineName"></td>
                <td><img alt="" data-bind="attr: { src: TypeImage }" /></td>
                <td data-bind="text: ManufacturerModel"></td>
            </tr>
        </tbody>
    </table>
    

    js:

    var dataFromServer = {
        searchCount:5,
        machines:[{
            GUID:"123",
            EndUserMachineName:"1",
            TypeImage:"https://i.chzbgr.com/maxW500/7879380224/hE2041EA3/",
            ManufacturerModel:"lorem lorem"
        }
            ]
    }
    var ajaxSim = function(callback){
        setTimeout(function(){
            callback(dataFromServer);
        },1000);
    }
    
    var mv;
    
    function viewmodel() {
        var self = this;
        self.searchViewModel = ko.observable({searchCount:4, machines:[]});
    }
    
    mv = new viewmodel();
    doSearch();
    ko.applyBindings(mv);
    
    function doSearch() {
        ajaxSim(
            function (msg) {
                console.log(msg)
    
                mv.searchViewModel(ko.mapping.fromJS(msg));
    
        });
    }
    

    【讨论】:

    • 感谢您的努力。我对mu代码做了如下修改:(1)修改了vm.searchViewModel的定义; (2)映射值的赋值给vm.searchViewModel; (3) 在视图中添加了 ()。我现在唯一担心的是,我可能需要在视图模型中定义复杂对象的所有属性。
    • 好吧,如果你有很多没有行为的数据道具,你可以使用 ko.mapping 来获取初始的可观察对象树,然后根据需要使用方法对其进行扩充。映射还有很多配置选项可能会有所帮助,请查看文档。
    猜你喜欢
    • 2013-07-02
    • 2015-03-07
    • 2013-11-15
    • 2013-01-19
    • 2012-06-22
    • 2012-12-26
    • 2018-02-10
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多