【问题标题】:Add an id in Knockout在 Knockout 中添加一个 id
【发布时间】:2013-11-03 20:43:33
【问题描述】:

我有一个 observableArray

self.workouts = ko.observableArray([
    {name: "Chest/Biceps", exercises:self.exercises1},
    {name: "Back/Triceps", exercises:self.exercises2},
    {name: "Legs/Shoulders", exercises:self.exercises3},
    ]);

exercises1 看起来像这样:

self.exercises1 = ko.observableArray([
    {name: "bench press", sets:self.sets},
    {name: "machine chest press", sets:self.sets1},
    {name: "standing biceps curl", sets:self.sets2},
    {name: "machine biceps curl", sets:self.sets3}
]);

我想要的是为exercises1 中的每个对象添加一个唯一的id,然后将其绑定到我的视图中。我尝试使用 attr 绑定,但没有成功。

我的视图如下所示:

<div class="content">
    <ul data-bind="foreach: workouts">
        <li class="name"><a class="name" data-bind="text:name"></a>
            <ul class="hhide" data-bind="foreach: exercises">
                <li class="name_ex"><a data-bind="text:name"></a>
                <div class="hhide">
                    <input id ="weight" type="text" placeholder="weight(kg)">
                    <span id="append">x</span>
                    <input id ="reps" type="text" placeholder="reps">
                    <button id="sets" data-bind="click: $root.addSet">Add set</button>
                    <div data-bind="foreach: sets">
                        <div id="sets" class="remove" data-bind="click: $root.removeSet">delete</div>
                        <div data-bind="visible: !editing(), text: name, click: edit"></div>
                        <input data-bind="visible: editing, value: name, hasFocus: editing" />
                    </div>
                    </div>
                </li>
            </ul>       
    </ul>
</div>

谢谢!

【问题讨论】:

    标签: javascript mvvm view knockout.js model


    【解决方案1】:

    这就是你要找的吗? (小提琴:http://jsfiddle.net/U7EFz/4/

    html:

    <div class="content">
        <ul data-bind="foreach: workouts">
            <li class="name"><a class="name" data-bind="text:name"></a>
                <ul class="hhide" data-bind="foreach: exercises">
                    <li class="name_ex">
                        <a data-bind="text:name, attr:{id:uniqueId}"></a>                                                                                               
                        | uniqueId:
                        <span data-bind="text:uniqueId"></span>
                    </li>
                </ul>       
            </li>
        </ul>
    </div>
    

    js:

    var VM = function(){
        var self = this;
        var idCounter = 0;
        self.getId = function(){        
            return "id" + (++idCounter);
        }
    
        self.exercises1 = ko.observableArray([
            {name: "bench press", uniqueId:"id1"},
            {name: "machine chest press", uniqueId:"id2"},
            {name: "standing biceps curl", uniqueId:"id3"},
            {name: "machine biceps curl", uniqueId:"id4"}
        ]);    
    
        self.workouts = ko.observableArray([
            {name: "Chest/Biceps", exercises:self.exercises1},
            {name: "Back/Triceps", exercises:self.exercises1},
            {name: "Legs/Shoulders", exercises:self.exercises1},
            ]);      
    }
    
    ko.applyBindings(new VM())
    

    【讨论】:

    • 是的,但是每次练习都使用随机 ID 不太好。我希望能够设置特定的 ID。比如:{name: "bench press", id: "ex1"}, {name: "machine chest press", "ex2"}等等。
    • 更新了 ID 计数器。像这样?
    • 嗯,这似乎是一个解决方案,但不是可以像我对每个name 那样添加一个ID 吗?就像在每个练习中给自己写一个 ID,而不是从函数中生成它?
    • 感谢您的回复。在您的示例中它有效,在我的代码中它没有。可能是因为我是这样用的:{name: "bench press", uniqueId:"1", sets:self.sets}。
    • 它应该可以工作,您是否在控制台中遇到任何错误?如果删除 self.sets 会怎样?
    猜你喜欢
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多