KnockoutJS在ko.applybinding之后不更新ui

时间:2018-10-23 09:29:34

标签: knockout.js

设置了ko.applybinding后,html不会刷新。这只发生在我的选择选项对象上。

    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:
}           
    }

ViewModel:

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

}

如果服务器足够快,则下拉选择将被填充,但是如果它们在ko.applybinding发生之后发生,则不会填充列表。数组在“监视”中被视为可观察到的数组。所以我不知道发生了什么。

1 个答案:

答案 0 :(得分:0)

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

例如

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

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


作为对评论的答复-有关所有这些文档,请参见基因敲除js网站(非常全面)。

要稍微扩展一下正在发生的事情,请想象用服务器端语言进行相同的操作:

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时在视图模型上的实例)。如果您更改了事实,则在视图模型上更改实例后,绑定不会更新,但是您的前端仍然绑定到可观察数组的初始实例。