KnockoutJS 在 ko.applybinding 之后没有更新 ui

KnockoutJS not updating the ui after ko.applybinding

设置ko.applybinding后html不刷新。这只发生在我的 select-options 对象上。

    public ProjectleaderList: KnockoutObservableArray<string> = ko.observableArray([]);
    public AccountmanagerList: KnockoutObservableArray<string> = ko.observableArray([]);
    public OrganisationcontactList: KnockoutObservableArray<string> = ko.observableArray([]);

function(records) {
 let records = result.Records;
    switch (result.Message) {
        case "AccountManager":
            OrderPage.Instance().AccountmanagerList = ko.observableArray(records);
            OrderPage.Instance().Order.AccountManagerName = OrderPage.Instance().GetInitialListValue(OrderPage.Instance().Order.AccountManagerModelId, records);
            break;
        case "Organisationcontact":
            OrderPage.Instance().OrganisationcontactList = ko.observableArray(records);
            OrderPage.Instance().Order.OrganisationcontactName = OrderPage.Instance().GetInitialListValue(OrderPage.Instance().Order.OrganisationcontactModelId, records);

            break;
        case "Projectleader":
            OrderPage.Instance().ProjectleaderList = ko.observableArray( records);
            OrderPage.Instance().Order.ProjectLeaderName = OrderPage.Instance().GetInitialListValue(OrderPage.Instance().Order.ProjectLeaderModelId, records);
            break;
        default:
}           
    }

视图模型:

    public ViewModel() {
    this.Order = OrderPage.Instance().Order;
    this.AccountmanagerList = OrderPage.Instance().AccountmanagerList;
    this.ProjectleaderList = OrderPage.Instance().ProjectleaderList;
    this.OrganisationcontactList = OrderPage.Instance().OrganisationcontactList;

}

如果服务器足够快,下拉列表 select 会被填充,但如果它们出现在 ko.applybinding 发生之后,则列表不会被填充。这些数组在 'Watch' 中被视为 knockoutobservablearrays。所以我不知道发生了什么。

您似乎应该设置可观察数组的值,而不是将其设置为可观察数组的新实例(假设在您首次创建实例时将其初始化为空数组).

例如

case "AccountManager":
            OrderPage.Instance().AccountmanagerList(records);
            OrderPage.Instance().Order.AccountManagerName = OrderPage.Instance().GetInitialListValue(OrderPage.Instance().Order.AccountManagerModelId, records);
            break;

在应用绑定时,您的列表将绑定到 obs 数组的原始实例 - 这不会改变。


回复评论 - 所有这些的文档都在 knockoutjs 网站上(非常全面)。

为了进一步说明正在发生的事情,想象一下用服务器端语言做同样的事情:

class Foo {
   public Bar X { get; set;}
   ctor() {
     X = new Bar();
   }
}

var myFoo = new Foo();
var aBar = myFoo.X;
myFoo.X = new Bar();
bool match = aBar == myFoo.X; //False

您正在绑定到可观察数组的初始实例(即调用 applyBindings 时视图模型上的实例)。如果您更改视图模型上的实例 post 事实上,绑定不会更新,但您的前端仍然绑定到可观察数组的初始实例。