如何使用Knockout.js将对象用作输入值

时间:2013-12-30 23:35:39

标签: javascript jquery knockout.js

我想使用observableArray作为select2插件中的默认标签,但我正在努力获得正确的上下文并以正确的方式设置插件。

这是html:

<div data-bind="with: SelectedText">
    <h1>Title: <span data-bind="text: Title"></span></h1>
    <div>
        <label>A: Local Managers:</label>
        <input type="hidden" data-bind="value: managerTags, select2: { tags: $root.Tags, minimumInputLength: 1, tokenSeparators: [',', ' '] }">        
        <label>B: Global Managers:</label>
        <input type="hidden" data-bind="value: $root.managerTags, select2: { tags: $root.promans, minimumInputLength: 1, tokenSeparators: [',', ' '] }">

        C: Local  Selected: <span data-bind="text: managerTags"></span>
        D: Global Selected: <span data-bind="text: $root.managerTags"></span>
    </div>
</div>

请在此处查看完整的小提琴:http://jsfiddle.net/6cWDX/

为什么“A:Local Managers”的上下文不适用于“C:Local Selected”? 如何使用Tag对象数组(self:Tags)作为select2插件的选项?

1 个答案:

答案 0 :(得分:1)

实际上,$ root.SelectedText.managerTags和managerTags都会在您的代码段(SelectedText)的上下文中产生相同的结果,正如您所期望的那样。它在$ root.SelectedText.managerTags上的$ root.managerTags上的工作方式不同,原因是前者是一个字符串数组,后者是一个对象数组:

    Local  Selected: <span data-bind="text: ko.toJSON(managerTags)"></span>
    <br>
    Global Selected: <span data-bind="text: ko.toJSON($root.managerTags)"></span>

结果:

Local Selected:[{“Id”:1,“Name”:“Ronald”,“Type”:0},{“Id”:4,“Name”:“George”,“Type”:0} ] 全球精选:“Asle,Jørgen”

编辑: 您在A和C之间注意到的差异是:

$root.SelectedText.managerTags

不起作用,因为SelectedText是可观察的。这样做:

$root.SelectedText().managerTags

将为A和C生成相同的结果