【问题标题】:Single Page Application Data Not Showing in the View单页应用程序数据未显示在视图中
【发布时间】:2013-06-30 05:09:40
【问题描述】:

我有一个 MVC 4 单页应用程序,我可以在其中看到数据视图模型的淘汰代码。我在视图中做了一个 foreach ,每次通过循环时都可以看到一个点,但数据没有显示。看起来可观察数组有 50 个元素,但每个元素都没有数据。然而,当我单步执行 getJson 调用时,我可以看到 json 格式的数据。怎么了?

这是我的 caapproval.html 查看代码-

<section>
    <h2 class="page-title" data-bind="text: title"></h2>

<br /> <br /> <br />

<ul data-bind="foreach: allCertificates">
    <li>
        <span data-bind="text: UserName"></span>
        <span data-bind="text: StatusCode"></span>
    </li>
</ul>

</section>

我的 caapproval.js 视图模型代码-

define(['services/logger'], function (logger) {
    var Certificate = function (ClientID, RequestDate, UserName,                                                 StatusDescription, StatusCode,     StatusDesc, CEOUserName ) {
    var self = this;
    self.ClientID = ko.observable(ClientID);
    self.RequestDate = ko.observable(RequestDate);
    self.UserName = ko.observable(UserName);
    self.StatusDescription = ko.observable(StatusDescription);
    self.StatusCode = ko.observable(StatusCode);
    self.StatusDesc = ko.observable(StatusDesc);
    self.CEOUserName = ko.observable(CEOUserName);
};

var allCertificates = ko.observableArray();

var vm = {
    allCertificates: allCertificates,
    activate: activate,
    title: 'Certificates'
};


return vm;


function getallCertificates() {
    $.getJSON('/api/caapproval', function (data) {

        allCertificates([]);
        var temp = allCertificates();
        data.forEach(function (p) {
            var certificate = new Certificate(p.ClientID,  p.RequestDate, p.UserName, p.StatusDescription, p.StatusCode, p.StatusDesc, p.CEOUserName);
            temp.push(certificate);
        });

        allCertificates.valueHasMutated();
        return allCertificates();
    });

}

//#region Internal Methods
function activate() {
    logger.log('CA Approval View Activated!!', null, 'CA Approval',  true);
    return getallCertificates();
}
//#endregion

});

【问题讨论】:

    标签: json asp.net-mvc-4 knockout.js single-page-application durandal


    【解决方案1】:

    首先,我相信您正在尝试将结果推送到 observableArray 而不是该数据的临时持有者。如果是这种情况,我建议将您的代码调整为以下 -

    function getallCertificates() {
        $.getJSON('/api/caapproval', function (data) {
    
            allCertificates([]);
            data.forEach(function (p) {
                var certificate = new certificateModel(p.ClientID,  p.RequestDate, p.UserName, p.StatusDescription, p.StatusCode, p.StatusDesc, p.CEOUserName);
                allCertificates.push(certificate);
            });
        });
    }
    

    您已经使用 ([]) 将 observableArray 设置为空,因此将值推回到那里。此外,Knockout 会在您设置它们时知道这些值发生了变异,并且它会跟踪它们,因此无需调用 valueHasMutated。

    接下来,我不认为您打算像您一样在视图模型中定义模型。把它放在你的模型之外,或者完全放在一个单独的 JavaScript 文件中。为了改进您的命名约定,我建议将证书重命名为 certificateModel 以便更清楚地表明这不是做某事的函数,而是一个模型。

    define(['services/logger'], function (logger) {
    
    var allCertificates = ko.observableArray();
    
    var vm = {
        allCertificates: allCertificates,
        activate: activate,
        title: 'Certificates'
    };
    
    return vm;
    
    });
    
    var certificateModel = function (ClientID, RequestDate, UserName, StatusDescription, StatusCode, StatusDesc, CEOUserName ) {
        var self = this;
        self.ClientID = ko.observable(ClientID);
        self.RequestDate = ko.observable(RequestDate);
        self.UserName = ko.observable(UserName);
        self.StatusDescription = ko.observable(StatusDescription);
        self.StatusCode = ko.observable(StatusCode);
        self.StatusDesc = ko.observable(StatusDesc);
        self.CEOUserName = ko.observable(CEOUserName);
    };
    

    这里有一个 jsFiddle 或多或少地展示了你想要做什么。 jsFiddle 不支持 Durandal 视图模型组合,所以我不得不对其进行一些更改,但基本功能已经存在。

    http://jsfiddle.net/DwHXR/2/

    【讨论】:

    • 我更改了视图模型代码,但仍然遇到同样的问题。没有数据可见。然后我将查看代码更改为您在 Fiddle 中发送的代码并收到错误“未定义路由器。
    • Router not defined 很清楚,但在上面的代码中没有。在某处您提到了 durandals 路由器,但您从未定义它。
    • 我发现了问题。在我的原始代码“return allCertificates();”中,数据没有被推送到 allCertificates 可观察数组中。更正后的代码是“return allCertificates(data);”。我还必须添加 kadumel 的 certificateModel 变量,并匹配从我的 web api 返回的字段名称(它们区分大小写)。我还将我的模型与视图模型代码分开。谢谢卡杜梅尔。你让我走上了正轨!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多