Knockout.js 在Knockout中,如何延迟数据绑定直到填充数组?
我已经多次遇到这种模式,但还没有找到一种优雅的方法来处理它。我正在尝试设置一个只读和编辑模式的页面 以下是html: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
<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设置为未定义
以下是我认为正在发生的事情:
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从可观察数组中获取选项的值和文本
- 在填充视图模型的其余部分后,将加载可观察阵列的数据
- 阵列的选定值来自视图模型的另一个字段
我知道这对你来说已经晚了,可能不是你的情况,但听起来很相似,可能会帮助其他人。我相信我今天也遇到了同样的问题,并找到了解决办法:
- SELECT从可观察数组中获取选项的值和文本
- 在填充视图模型的其余部分后,将加载可观察阵列的数据
- 阵列的选定值来自视图模型的另一个字段
我知道这对您来说已经晚了,可能不完全是您的情况,但听起来类似,可能会帮助其他人。为什么不简单地用最初选择的事件类型初始化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在新数组中标识与先前选择的项相对应的项的唯一方法),你还可以