Select 框不允许我设置默认值,loading/binding 将值重置为第一项
Select box not allowing me to set default, loading/binding resets value to first item
我在我的很多项目中都使用了 knockout,但还没有将它用作添加记录的初始形式(我已经广泛使用它来根据 UI 请求创建记录并且效果很好) .如果我通过单击按钮(在文档加载后)加载一组默认值,那么一切都很好。如果我尝试在加载时初始化表单,则无法将默认值分配给 select
.
<select data-bind="options: statusList, optionsText: function(item){ return item.Status() }, optionsValue: 'Id', value: actualRequest().StatusId"></select>
statusList
在数据库 table 中提供,请求对象也是一个数据库对象,使用 Breezejs 调用创建。我正在初始化这些值,其中大部分都可以正常初始化(例如日期选择器和输入默认值),但是这些 select
元素并没有按照我认为应该的方式进行初始化。
从我的视图模型中选择的,都合适:
var em = new breeze.EntityManager(serviceAddress);
function fetchMetaData() {
if (em.metadataStore.isEmpty()) {
return em.fetchMetadata();
}
return Q.resolve();
};
var load = function () {
fetchMetaData().done(function () {
em.executeQuery(breeze.EntityQuery.from('Statuses'))
.then(function (data) { statusList(data.results); })
.fail(function (error) { logger.error(error.message, "loadStatuses failed during initialization"); });
// A couple more data calls for other data fills
setupCreateNew();
});
};
var setupCreateNew = function() {
actualRequest(em.createEntity('Submittal', { id: breeze.core.getUuid() }));
actualRequest().StatusId(2); // 2 is the default value we want
// more initialization defaults
};
var actualRequest = new ko.observable('');
var statusList = new ko.observable([]);
初始化者
app.manageSubmittalRequestViewModel.load();
ko.applyBindings(app.manageSubmittalRequestViewModel, document.getElementById('manageSubmittalRequestId'));
行为是这样的,页面初始化时,actualRequest().StatusId()
为 2,当页面 applyBindings
完成时,actualRequest().StatusId()
的值已更改为 a 1. select
元素的任何使用都会将值更改为正确的值,并且一切正常。我将 value:
属性更改为本地(未初始化的)敲除变量,该变量在声明期间也被初始化为 2,它在绑定时也被重置为 1。
这是我做错了什么吗?我如何弄清楚是什么重置了它?我在视图中搜索了任何可能具有相似名称的关联...没有!
附加修正
修复正在将初始化更改为此:
var load = function () {
fetchMetaData().done(function () {
em.executeQuery(breeze.EntityQuery.from('Statuses'))
.then(function (data) { statusList(data.results); })
.fail(function (error) { logger.error(error.message, "loadStatuses failed during initialization"); })
.done( function () { setupCreateNew(); });
});
};
最好的猜测是时间问题。在调用 setupCreateNew
之前,您不会等待初始化 statusList
。你可以尝试做一些事情而不是
em.executeQuery(breeze.EntityQuery.from('Statuses'))
.then(function (data) { statusList(data.results); })
.then(function() { setupCreateNew(); })
.fail(function (error) { logger.error(error.message, "loadStatuses failed during initialization"); });
看看是否有帮助。
我在我的很多项目中都使用了 knockout,但还没有将它用作添加记录的初始形式(我已经广泛使用它来根据 UI 请求创建记录并且效果很好) .如果我通过单击按钮(在文档加载后)加载一组默认值,那么一切都很好。如果我尝试在加载时初始化表单,则无法将默认值分配给 select
.
<select data-bind="options: statusList, optionsText: function(item){ return item.Status() }, optionsValue: 'Id', value: actualRequest().StatusId"></select>
statusList
在数据库 table 中提供,请求对象也是一个数据库对象,使用 Breezejs 调用创建。我正在初始化这些值,其中大部分都可以正常初始化(例如日期选择器和输入默认值),但是这些 select
元素并没有按照我认为应该的方式进行初始化。
从我的视图模型中选择的,都合适:
var em = new breeze.EntityManager(serviceAddress);
function fetchMetaData() {
if (em.metadataStore.isEmpty()) {
return em.fetchMetadata();
}
return Q.resolve();
};
var load = function () {
fetchMetaData().done(function () {
em.executeQuery(breeze.EntityQuery.from('Statuses'))
.then(function (data) { statusList(data.results); })
.fail(function (error) { logger.error(error.message, "loadStatuses failed during initialization"); });
// A couple more data calls for other data fills
setupCreateNew();
});
};
var setupCreateNew = function() {
actualRequest(em.createEntity('Submittal', { id: breeze.core.getUuid() }));
actualRequest().StatusId(2); // 2 is the default value we want
// more initialization defaults
};
var actualRequest = new ko.observable('');
var statusList = new ko.observable([]);
初始化者
app.manageSubmittalRequestViewModel.load();
ko.applyBindings(app.manageSubmittalRequestViewModel, document.getElementById('manageSubmittalRequestId'));
行为是这样的,页面初始化时,actualRequest().StatusId()
为 2,当页面 applyBindings
完成时,actualRequest().StatusId()
的值已更改为 a 1. select
元素的任何使用都会将值更改为正确的值,并且一切正常。我将 value:
属性更改为本地(未初始化的)敲除变量,该变量在声明期间也被初始化为 2,它在绑定时也被重置为 1。
这是我做错了什么吗?我如何弄清楚是什么重置了它?我在视图中搜索了任何可能具有相似名称的关联...没有!
附加修正
修复正在将初始化更改为此:
var load = function () {
fetchMetaData().done(function () {
em.executeQuery(breeze.EntityQuery.from('Statuses'))
.then(function (data) { statusList(data.results); })
.fail(function (error) { logger.error(error.message, "loadStatuses failed during initialization"); })
.done( function () { setupCreateNew(); });
});
};
最好的猜测是时间问题。在调用 setupCreateNew
之前,您不会等待初始化 statusList
。你可以尝试做一些事情而不是
em.executeQuery(breeze.EntityQuery.from('Statuses'))
.then(function (data) { statusList(data.results); })
.then(function() { setupCreateNew(); })
.fail(function (error) { logger.error(error.message, "loadStatuses failed during initialization"); });
看看是否有帮助。