【问题标题】:KnockoutJS foreach isnt working within remotely loaded modal dialogKnockout JS foreach 在远程加载的模式对话框中不起作用
【发布时间】:2013-04-18 22:31:14
【问题描述】:

我有一个远程模态对话框,一旦加载,它就会创建一个新模型,其中包含一些模态信息:

var modalModel = {
    SessionId: viewModel.SessionId(),
    RetCols: ko.observableArray([])
};

$('#UploadModal').ajaxComplete(function (event, request, settings) {
    ko.applyBindings(modalModel, $('#zupload')[0]);
});

这很好用,我正在将会话 ID 打印到模态,所以我知道信息在那里并且模型正在萤火虫中显示。但是,我有以下函数可以进行 ajax 调用并将响应读入 observableArray RetCols。当我在页面上打印长度并且它显示它有项目时,这似乎正在工作,但我不能为我的生活 foreach 它。我没有看到这里有什么问题吗?这是ajax调用:

function uploadSubmit() {
$.ajax({
    url: '/Upload/UserSaveFileInfo/',
    type: 'post',
    async: false,
    data: ko.toJSON({
        UploadName: $("#uploadName").val(),
        UploadDescription: $("#uploadDescription").val(),
        Id:  $('#uploadId').val()
    }),
    contentType: 'application/json',
    success: function (result) {
        for (var i = 0; i < result.length; i++)
        {
            modalModel.RetCols.push({
                Id: result[i].Id,
                Header: result[i].Header,
                Values: result[i].Values,
                MatchedTo: result[i].MatchedTo,
                ColumnNumber: result[i].ColumnNumber
            });
        }
        alert(modalModel.RetCols().length);  
    },
    error: function (jqXHR, textStatus, errorThrown) {
        console.log(data);
    }
});
}

这是我的模态中不想工作的部分:

<span data-bind="text: modalModel.RetCols().length"></span>  <!-- this works! --> 


<!-- ko foreach: modalModel.RetCols -->
        <div class="control-group" >
            <label class="control-label">
                Column <span data-bind="text: $data.ColumnNumber"></span>
            </label>
            <div class="controls">
                <input data-bind="value: $data.MatchedTo" />
                <span class="help-block" data-bind="text: $data.Values"></span>
            </div>
        </div>
<!-- /ko -->

任何帮助将不胜感激!这是一个小提琴:http://jsfiddle.net/ZLBpu/154/ 由于模态的远程加载,它与上面描述的有点不同,但我或多或少地重复了正在发生的事情。

编辑:特别是,对 moveToModal 的 ajax 调用似乎是导致它爆炸的原因。这个小提琴在 ajax 调用中没有相同的功能,它的工作原理和我预期的一样:http://jsfiddle.net/valvemail/RJ8Vx/1/。所以 ajax 调用肯定有问题。

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    我认为您不需要输入“$data”。在 foreach 内的每个属性之前。

    编辑

    我让它在 jsFiddle link 中工作

    使用此 HTML:

    <span data-bind="text: RetCols().length"></span>  <!-- this works! --> 
    
    <!-- ko foreach: RetCols -->
        <div class="control-group" >
            <label class="control-label">
                Column <span data-bind="text: $data.ColumnNumber"></span>
            </label>
            <div class="controls">
                <input data-bind="value: $data.MatchedTo" />
                <span class="help-block" data-bind="text: $data.Values"></span>
            </div>
        </div>
    <!-- /ko -->
    

    还有这个 JS:

    var modalModel = {
        SessionId: 'a',
        RetCols: ko.observableArray([])
    };
    
    modalModel.RetCols.push({
        ColumnNumber: 1,
        MatchedTo: "mt",
        Values: "values"
    });
    
    ko.applyBindings(modalModel);
    

    编辑 2

    我看了看你的小提琴。我认为问题在于 viewModel 已经绑定到您尝试绑定 modalModel 的 html。为了解决这个问题,我稍微重构了代码,使 modalModel 成为 viewModel 的一部分。然后我将 boolean observable 放在 modalModel 上,您可以切换到“绑定”模态。

    我还将您插入的 html 放在 html 中的 ajax 调用中。我用一个敲除 if 绑定包围它,这样你就不应该因为不存在的属性而出错。

    Here is the fiddle

    【讨论】:

    • 我已经尝试了两种方法,但仍然无法正常工作......我认为无论有没有它,foreach 都可以工作,我只是习惯于处理儿童收藏,所以我得到了在使用它的习惯...
    • 好的...我不认为这应该是个问题,但是您是否尝试在 foreach 行上将“modalModel.RetCols”更改为“modalModel.RetCols()”?
    • 我认为您误解了这个问题,如果我不清楚,我深表歉意。我有 2 个单独的视图模型,一个存在于父页面上,一个是我在打开 ajax 加载模式窗口时创建的。 modalModel 用于加载数据的 iframe。我会做一个小提琴,但由于它有一个外部 iframe,它有点棘手...... modalModel 仅特定于 iframe 内容,这就是我在 ajax 完成加载 iframe 内容后应用模型的原因.. . 生病试着搞定,但我只是想办法以一种不连贯的方式做到这一点。 foreach RetVals() 也不起作用
    • 没有看到小提琴,我很难理解整个情况。希望您甚至可以举出一个简化的示例。关于 foreach,我将“modalModel.RectCols”更改为“RectCols”。由于您正在绑定modalModel,因此您可以直接引用该属性。当然,可能还有另一个与整个页面有关的问题可能会阻止它工作,就像它在小提琴中所做的那样。
    • 哇!那很有趣 :)。似乎特别是 ajax 有问题,因为在修补以使这个小提琴工作时,在 ajax 调用之外拥有该函数符合我的预期。但是在 ajax 调用中它不起作用,或者有时它可能会向我显示它的存在。另一个有趣的观察是,如果我重新启动模态框,框就在那里。我以前没有注意到这一点,因为我的开发版本有一系列 div 显示/隐藏它的工作......这里是小提琴:jsfiddle.net/ZLBpu/154
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2017-01-25
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多