简体   繁体   English

为什么我的数据绑定不起作用?

[英]Why my data-binding doesn't work?

I'm developing a SharePoint 2010 Web Part. 我正在开发SharePoint 2010 Web部件。 I would use knockout framework for data-binding. 我将使用敲除框架进行数据绑定。

I have one ascx with this code: 我有一个使用此代码的ascx:

    <table>
        <tr>
            <td>
                <label id="lblLastMaintenanceDate">Data ultima manuntenzione:</label>
            </td>
            <td>
                <span id="lastMaintenanceDate" data-bind="text: lastMaintenanceDate"></span>
            </td>
        </tr>
        <tr>
            <td>
                <label id="lblMaintenanceDescription">Descrizione manuntenzione:</label>
            </td>
            <td>
                <span id="MaintenanceDescription" data-bind="text: maintenanceDescription"></span>
            </td>
        </tr>
        <tr>
            <td>
                <label id="lblConcept">Concept:</label>
            </td>
            <td>
                <span id="Concept" data-bind="text: concept"></span>
            </td>
        </tr>
    </table>

Inside document.ready() I wrote this code: 在document.ready()内部,我编写了以下代码:

$(document).ready(function () {
    ko.applyBindings(ShopViewModel);
});

This is my ViewModel: 这是我的ViewModel:

var ShopViewModel = {
lastMaintenanceDate : ko.observable(),
maintenanceDescription : ko.observable(),
concept : ko.observable(),

GetShopDetail : function (val1) {

$.ajax({
        type: "GET",
        url: "../_layouts/MyProject/MasterPage.aspx/GetDetails?par1=" + val1,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: "{}",
        cache: false,
        async: false,
        success: function (result) {
            var oJson = eval("(" + result['d'] + ")");
            if (oJson.Success) {
                var result = oJson.Data;
                if (result) {
                    this.lastMaintenanceDate = String(result.LastMaintenanceDate);
                    this.maintenanceDescription = String(result.MaintenanceDescription);
                    this.concept = String(result.SyConceptId);
                }
            }
            else {
                WriteToConsole(oJson.Error);
                customAlert(oJson.Error, "Error");
            }
        }
    })
}

} }

And I call GetShopDetail function with this code: 我用以下代码调用GetShopDetail函数:

ShopViewModel.GetShopDetail(val1);

My problem is that data-binding doesn't work. 我的问题是数据绑定不起作用。

Can you help me? 你能帮助我吗?

Thanks 谢谢

Two reasons: 两个原因:

  1. Because this within your ajax callback is not your viewmodel. 因为this在Ajax回调中是不是你的视图模型。 If you want it to be, use bind 如果您愿意,请使用bind

  2. Because you're replacing your observables with raw properties. 因为您正在用原始属性替换可观测对象。 Instead, set the value of the observable 而是设置可观察值

So: 所以:

    success: function (result) {
        var oJson = eval("(" + result['d'] + ")");
        if (oJson.Success) {
            var result = oJson.Data;
            if (result) {
                // ************** Change on next three lines
                this.lastMaintenanceDate(String(result.LastMaintenanceDate));
                this.maintenanceDescription(String(result.MaintenanceDescription));
                this.concept(String(result.SyConceptId));
            }
        }
        else {
            WriteToConsole(oJson.Error);
            customAlert(oJson.Error, "Error");
        }
    }.bind(this)     // <===== Change here

Re #2, I suggest working through the Knockout tutorials , as this is one of the most fundamental aspects of KO. 关于#2,我建议完成Knockout教程 ,因为这是KO最基本的方面之一。


Side note: Don't use eval to parse JSON. 旁注:请勿使用eval解析JSON。 Use JSON.parse to parse JSON. 使用JSON.parse解析JSON。 Or $.parseJSON . $.parseJSON

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM