Knockout.js 在Knockout中,如何延迟数据绑定直到填充数组?

Knockout.js 在Knockout中,如何延迟数据绑定直到填充数组?,knockout.js,Knockout.js,我已经多次遇到这种模式,但还没有找到一种优雅的方法来处理它。我正在尝试设置一个只读和编辑模式的页面 以下是html: <div> <span data-bind="text: EventType, if: !EditMode()"></span> <select data-bind="options: $root.EventTypes, optionsValue: 'Id', optionsText: 'Name', v

我已经多次遇到这种模式,但还没有找到一种优雅的方法来处理它。我正在尝试设置一个只读和编辑模式的页面

以下是html:

<div>
    <span data-bind="text: EventType, if: !EditMode()"></span>
    <select data-bind="options: $root.EventTypes, optionsValue: 'Id', 
        optionsText: 'Name', value: EventType, if: EditMode()"></select>
</div>
<div>
    <a href="#" data-bind="click: edit">Edit</a>
</div>
我遇到了数据绑定的时间问题。调用applyBindings时,将正确填充范围。但是,当我进入编辑模式时,下拉列表未设置为选定值,EventType设置为未定义

以下是我认为正在发生的事情:

  • 用户单击Edit按钮,并进行ajax调用以检索 事件类型
  • 选择是数据绑定的。由于EventTypes数组为空,EventType设置为null
  • ajax调用完成并填充EventType
  • 由于EventType先前设置为null,因此选择了下拉列表中的第一项。(例如,原始EventType值丢失。)
  • 我希望它能做什么:

  • 用户单击Edit按钮,并进行ajax调用以检索 事件类型
  • ajax调用完成并填充EventTypes数组
  • 选择将被数据绑定,并且列表中的正确项将被选择
  • 不要将EventTypes数组设置为空,而是使用最初选择的事件类型引导它,这样在启用select时不会清除EventType值。一旦ajax从调用返回,内容将被覆盖。i、 e:

    self.EventTypes = ko.observableArray([eventJSON.EventType]);
    
    或者,如果由于某种原因无法预先初始化数组,并且由于初始事件仍在ajax回调的范围内,只需在加载数组后重置EventType即可:

    $.getJSON("url...", function(eventTypesJSON) {
       self.EventTypes(eventTypesJSON);
       self.EventType(eventJson.EventType);
    }
    
    在后者中,注意不要将初始视图模型参数与ajax回调中的参数使用相同的名称,否则后者将覆盖第一个参数。

    不要将EventTypes数组设置为空,而是使用最初选择的事件类型引导它,因此,启用select时不会清除EventType值。一旦ajax从调用返回,内容将被覆盖。i、 e:

    self.EventTypes = ko.observableArray([eventJSON.EventType]);
    
    或者,如果由于某种原因无法预先初始化数组,并且由于初始事件仍在ajax回调的范围内,只需在加载数组后重置EventType即可:

    $.getJSON("url...", function(eventTypesJSON) {
       self.EventTypes(eventTypesJSON);
       self.EventType(eventJson.EventType);
    }
    

    对于后者,请注意不要将初始视图模型参数与ajax回调中的参数使用相同的名称,否则后者将覆盖第一个参数。

    我相信我今天也遇到了同样的问题,并找到了解决方案:

    • SELECT从可观察数组中获取选项的值和文本
    • 在填充视图模型的其余部分后,将加载可观察阵列的数据
    • 阵列的选定值来自视图模型的另一个字段
    通过将所选的值传递给从web服务调用加载数组的函数,我可以使它正常工作。调用完成后,我将该值分配回最初用作所选值的可观察值。这样做会强制该字段的订阅者重新绑定,以便现在填充的选择正确更改选定值


    我知道这对你来说已经晚了,可能不是你的情况,但听起来很相似,可能会帮助其他人。

    我相信我今天也遇到了同样的问题,并找到了解决办法:

    • SELECT从可观察数组中获取选项的值和文本
    • 在填充视图模型的其余部分后,将加载可观察阵列的数据
    • 阵列的选定值来自视图模型的另一个字段
    通过将所选的值传递给从web服务调用加载数组的函数,我可以使它正常工作。调用完成后,我将该值分配回最初用作所选值的可观察值。这样做会强制该字段的订阅者重新绑定,以便现在填充的选择正确更改选定值


    我知道这对您来说已经晚了,可能不完全是您的情况,但听起来类似,可能会帮助其他人。

    为什么不简单地用最初选择的事件类型初始化EventTypes数组(即self.EventTypes=ko.observableARay([eventJSON.EventType]);)?我做了一些测试,它应该可以工作-添加了一个答案。为什么不简单地用最初选择的事件类型(即self.EventTypes=ko.observearray([eventJSON.EventType]);)初始化EventTypes数组呢?我做了一些测试,它应该可以工作-添加了一个答案。我的示例没有显示它,但是EventType实际上是对象而不是字符串,所以我不能用eventJSON.EventType初始化数组。我明白了,我没有注意到“optionsValue”和“optionsText”绑定-无论如何,我认为KO只关心绑定中需要使用的属性,因此,假设初始eventJSON.EventType值等于eventTypesJSON中返回对象的id属性(这是KO在新数组中识别与先前选择的项相对应的项的唯一方法),您仍然可以使用“虚拟”对象预加载数组:
    self.EventTypes=KO.observableArray([{Id:eventJSON.EventType,名称:'some fake Name'}])
    感谢您对此进行研究。我们从来没有让它工作过。现在我们只是预加载所有查找表,以便保证数据可用。我的示例没有显示它,但EventType实际上是对象而不是字符串,因此我无法用eventJSON.EventType初始化数组。我明白了,我没有注意到“optionValue”和“optionsText”绑定——无论如何,我认为KO只关心绑定中需要使用的属性,因此假设初始eventJSON.EventType值等于eventTypesJSON中返回对象的id属性(这是KO在新数组中标识与先前选择的项相对应的项的唯一方法),你还可以