【问题标题】:Binding array data using knockout.js with html使用带有 html 的 knockout.js 绑定数组数据
【发布时间】:2012-08-10 13:25:03
【问题描述】:

我有一个使用 knockout.js 映射插件获得的类别模型,见下文

var categoriesViewModel = ko.mapping.fromJS(data);

现在这个 categoriesViewModel 有类似的数据

[0]{id=1,name="adventure",description="abc"}

[1]{id=2,name="urban",description="def"}

[2]{id=3,name="romantic",description="ghi"}

我想用下面的html标记绑定数据

 <section class="categories">

                <ul class="categories-list">
                    <li class="urban"><a  href="javascript:;"><span>urban living</span></a></li>
                    <li class="adventure"><a href="javascript:;"><span>adventure</span></a></li>
                    <li class="romantic"><a href="javascript:;"><span>romantic</span></a></li>
                </ul>
                    <div class="descr">
                        <h3 data-bind="text: name"></h3>
                        <p data-bind="text: Description"></p>
                    </div>
</section>

我想要的是鼠标悬停在任何标签上,相关描述显示在 p 标签中,名称显示在标签中。

我可以使用 javascript 绑定数据

ko.applyBindings(categoriesViewModel()[0], $('.categories .descr p').get(0));

但在这里我使用的是 [0] 之类的索引号,这是一种硬编码的方法,所以我不希望这样。我应该怎么做才能动态绑定数据,即没有在 categoriesViewModel() 中指定索引?

【问题讨论】:

    标签: asp.net-mvc knockout.js


    【解决方案1】:

    听起来你需要做的是添加一个“currentItem”或类似于你的视图模型,然后将你的descr div绑定到它(使用with)。然后,您可以将鼠标悬停在您的类别上以更新 currentItem,并且它应该全部自动更新。

    另外,为什么不为您的类别使用 foreach 绑定?

    看看这是否有帮助:http://jsfiddle.net/QaYGz/1/

    【讨论】:

    • 请看我的cmets回复twofolwer的回答。
    • @khurram:如果您不想使用 foreach 循环,请不要使用它。这只是一个建议,如果您希望您的类别列表发生变化,您应该真正考虑是否可以使其工作。无论哪种方式,我在 jsfiddle 中演示的使用 currentItem 的原则仍然有效,无论您是对分类进行硬编码还是使用循环。
    • 如果我不使用循环,如何将我的类别与 标签绑定。
    • @khurram:如果你想绑定集合中的东西而不是循环,那么这很容易。你只需索引它,例如:text:categories()[0].description
    【解决方案2】:

    这行得通

    <section class="categories">
      <ul class="categories-list" data-bind="foreach: categories">
        <li class="urban"><a href="javascript:;"><span data-bind='text: name, event: { mouseover: function(data, event) { $root.updateDescription($data) }, mouseout: function(data, event) { $root.clearDescription() } }'></span></a></li>                    
      </ul>
      <div class="descr">
        <h3 id="idName" data-bind="text: name"></h3>
        <p id="idDescription" data-bind="text: Description"></p>
      </div>
    </section>
    
    var json = {"categories":[{"id":"1","name":"adventure","description":"abc"},
    {"id":"2","name":"urban","description":"def"},
    {"id":"3","name":"romantic","description":"ghi"}]};
    
    var model = ko.mapping.fromJS(json);
    
    model.updateDescription = function(val) {    
        $("#idName").text(val.name());
        $("#idDescription").text(val.description());
    }
    
    model.clearDescription = function() {
        $("#idName").text('');
        $("#idDescription").text('');
    }
    
    ko.applyBindings(model);
    

    另请参阅this fiddle 进行测试。

    【讨论】:

    • 由于特定的布局,我不能使用循环,所以我想将该部分绑定到类别数组。我想将一个类别专门绑定到每个项目。可能是我应该在属性中绑定描述 ID,然后使用该 ID,但我不知道该怎么做。你能帮帮我吗?
    猜你喜欢
    • 2012-05-26
    • 2013-01-14
    • 2014-06-20
    • 2013-01-13
    • 2021-08-03
    • 2014-04-16
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多