选择框不允许我设置默认值,加载/绑定将值重置为第一项

时间:2015-03-28 00:01:22

标签: javascript knockout.js breeze

我在我的很多项目中都使用了淘汰赛,但是没有将它用作添加记录的初始形式(我已经广泛使用它来创建UI请求的记录,并且效果很好)。如果我通过按钮点击加载一组默认值(在文档加载后),那么一切都很好。如果我尝试在加载时初始化表单,则无法将默认值分配给select

<select data-bind="options: statusList, optionsText: function(item){ return item.Status() }, optionsValue: 'Id', value: actualRequest().StatusId"></select>
数据库表中提供了

statusList,请求对象也是使用Breezejs调用创建的数据库对象。我正在初始化值,其中大部分初始化很好(如datepickers和输入默认值),但这些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()的值已更改为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(); });
    });
};

1 个答案:

答案 0 :(得分:1)

最佳猜测是时间问题。在致电statusList之前,您还没有等待初始化setupCreateNew。你可以尝试做一些事情,比如

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

看看是否有帮助。