KnockoutJS-将迭代索引打印为输入名称


问题内容

我正在尝试结合Spring MVC的@ModelAttribute绑定创建我的第一个KnockoutJS表单视图。

  • 数据通过Ajax加载并用KnockoutJS填充
  • 数据通过KnockoutJS添加
  • 通过Ajax和KnockoutJS删除数据
  • 数据将通过常规POST提交保存到Spring MVC控制器。

要将表单输入绑定到Spring MVC控制器,我需要来自KnockoutJS的迭代索引。因此,我尝试了以下操作:

但是,我数据库中的值从未像我绑定它们时那样被绑定data-bind='value: key'。您能帮助我,发现错误吗?

JSP:

<form:form modelAttribute="configurationHelper" action="/saveConfigurationList.htm" method="POST" id="configuration-form" class="form-inline">
    <tbody data-bind="foreach: configurations">
        <tr>
            <td>
                // this is working
                <input data-bind='value: key' class="form-control input-sm" type="text"/>
                // this is not working
                <input data-bind='attr:{value: key, name:configurationHelper.configurations[$index].key' class="form-control input-sm" type="text"/> 
            </td>
            <td>
                <a href='#' data-bind='click: $root.removeConfiguration' class="ordinary-tooltip" title="<spring:message code="general.delete"/>'>
                    <i class="fa fa-lg fa-trash-o "></i>
                </a>
            </td>
         </tr>
    </tbody>
</form:form>

模型视图:

function ConfigurationViewModel() {
    var self = this;
    self.configurations = ko.observableArray([]);

    self.loadConfigurations = function() {
        $.ajax({
            type : "POST",
            url : "/loadConfigurationList.htm",
            success : function(response) {
                var responseArray = JSON.parse(response);
                var mappedConfigurations = $.map(responseArray.configurations, function(configuration) {
                    return new Configuration(configuration);
                });
                self.configurations(mappedConfigurations);
            },
            error : function(e) {
                alert('Error: ' + e.status);
            }
        });
    }

    self.saveConfigurationList = function() {
        $("#configuration-form").submit();
    }

    self.addConfiguration = function() {
            self.configurations.push({
                id: 0,
                key: "",
                value: "",
        });
    };

    self.removeConfiguration = function(configuration) {
        if(confirm(springMessageGeneralDeleteReally)){
            $.ajax({
                type : "POST",
                url : "/deleteConfiguration.htm",
                data: {"configurationId": configuration.id},
                success : function(response) {
                    self.configurations.remove(configuration);
                },
                error : function(e) {
                    alert('Error: ' + e.status);
                }
            });
        }
    };
}


function Configuration(data) {
    this.id = ko.observable(data.id);
    this.key = ko.observable(data.key);
    this.value = ko.observable(data.value);
}

摘要:

  • 淘汰只应注意将值(随AJAX加载)绑定到输入并显示正确的输入名称。(将输入值绑定回Spring MVC控制器)
  • configurationHelper是一个请求参数,请勿打扰。它仅可用于将列表绑定configurationHelper.configurations到Spring MVC。

以下形式已正确绑定到Spring MVC控制器:

<form:form modelAttribute="configurationHelper" action="/leina16/configuration/saveConfigurationList.htm" method="POST" id="configuration-form" class="form-inline">
    <form:input path="configurations[0].key" class="form-control input-sm"/>
</form:form>

现在,我想使用Knockout JS扩展输入,因此我至少需要该data-bind属性以及foreach: $indexKnockout中的from:

<tbody data-bind="foreach: configurations">
    <input data-bind='attr:{value: key, name:"configurations[$index].key}' class="form-control input-sm" type="text"/>
</tbody>

但是上面的片段既没有绑定到Spring MVC控制器方法,也没有填充值。


问题答案:

解:

将引号添加到“ non-Knockout”元素,并使用$ index()函数。

<tbody data-bind="foreach: configurations">
    <tr>
        <td>
            <input data-bind='attr:{value: key, name:"configurations["+$index()+"].key"}' class="form-control input-sm" type="text"/>
        </td>

     </tr>
 </tbody>