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 事实上,绑定不会更新,但您的前端仍然绑定到可观察数组的初始实例。
设置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 事实上,绑定不会更新,但您的前端仍然绑定到可观察数组的初始实例。