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"); });

看看是否有帮助。