【问题标题】:Knockout JS: Binding Dynamic RowsKnockout JS:绑定动态行
【发布时间】:2013-03-09 03:02:15
【问题描述】:

我在绑定动态创建的 dom 元素时遇到了一些麻烦

代码:

var i=0;

$.each(data.info, function(index, element) {                        
    $("#div1").append("<tr><td>" + element.Name + "</td><td>"+ element.Major +"</td><td>" + element.Sex +"</td><td>" + "<input data-bind='value: eng"+i+"' ></td><td>" + "<input data-bind='value: jap"+i+"' ></td><td>" +  "<input data-bind='value: cal"+i+"' ></td><td>" + "<input data-bind='value: geo"+i+"' ></td><td>" + "<strong data-bind='text: total'></td>" )
i++;
});

这将创建具有输入数据绑定值 eng0、eng1、jap0、jap1 等的行。

我想将这些绑定为可观察对象

代码

function AppViewModel() {
    this.eng = ko.observable(element.English);
    this.jap = ko.observable(element.Japanese);
    this.cal = ko.observable(element.Calculus);
    this.geo = ko.observable(element.Geometry);

    this.total = ko.computed(function() {
    var tot=parseFloat(this.eng()) + parseFloat(this.jap()) + parseFloat(this.cal()) + parseFloat(this.geo());
    return (tot);    
    }, this);

}

    ko.applyBindings(new AppViewModel());

这段代码也在$.each(data.info, function(index, element){}里面

我想要一些类似的东西

Var i=0;
$.each(data.info, function(index, element) {

function AppViewModel() {
        this.eng+i = ko.observable(element.English);
        this.jap+i = ko.observable(element.Japanese);
        this.cal+i = ko.observable(element.Calculus);
        this.geo+i = ko.observable(element.Geometry);

        this.total+i = ko.computed(function() {
        var tot=parseFloat(this.eng()) + parseFloat(this.jap()) + parseFloat(this.cal()) + parseFloat(this.geo());
        return (tot);    
        }, this);

    }
i++;
}

这让我得到结果this.eng0 = ko.observable()

注意:数据是从 JSON 对象中获取的。我只包含了迭代路径

【问题讨论】:

    标签: javascript jquery dynamic knockout.js observable


    【解决方案1】:

    我可以建议使用foreach binding 可能比使用jQuery 的each 并自己生成HTML 更好吗?我建议将您的视图模型更改为这样的:

    function AppViewModel() {
       this.items = ko.observableArray();
    }
    
    function ItemViewModel(element) {
        this.eng = ko.observable(element.English);
        this.jap = ko.observable(element.Japanese);
        this.cal = ko.observable(element.Calculus);
        this.geo = ko.observable(element.Geometry);
    
        this.name = ko.observable(element.name);
        this.major = ko.observable(element.major);
        this.sex = ko.observable(element.sex);
    
        this.total = ko.computed(function () {
            var tot = parseFloat(this.eng()) + parseFloat(this.jap()) + parseFloat(this.cal()) + parseFloat(this.geo());
            return (tot);
        }, this);
    
    };
    

    在这里,AppViewModel 是元素列表的容器,每个元素都是它自己的 ItemViewModel,具有您似乎拥有的属性。

    绑定 this 的 html 是这样的:

    <table>
        <tbody data-bind="foreach: items">
        <tr>
            <td data-bind="text: name"></td>
            <td data-bind="text: major"></td>
            <td data-bind="text: sex"></td>
            <td><input data-bind='value: eng' /></td>
            <td><input data-bind='value: jap' /></td>
            <td><input data-bind='value: cal' /></td>
            <td><input data-bind='value: geo' /></td>
            <td><strong data-bind='text: total' /></td>
        </tr>
        </tbody>
    </table>
    

    当您从服务器获取 JSON 时,您可以使用 Knockout 的 built-in JSON stuffmapping plugin,或者自己解析它们。我在this jsfiddle 中使用后一个选项创建了一个示例。

    【讨论】:

    • 谢谢。我想知道有什么方法可以将可观察对象绑定到动态元素,就像 eng+1 一样。
    • 我不确定您所说的“eng+1”或“动态元素”是什么意思?也许你应该尝试一下你想要的,如果你遇到困难,再问一个后续问题。
    猜你喜欢
    • 2019-03-11
    • 2018-10-19
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    相关资源
    最近更新 更多