正如迈克尔·贝斯特所指出的,城市实际上并没有改变。如果您的城市本身就是视图模型,那么您所描述的将会自动发生。
但是,由于您只有原语,因此您需要明确告诉您 viewmodel 在数组更改时“清除” city 的当前值。然后它将自动选择第一个元素。
您可以通过在点击事件中设置self.City
为来执行此操作''
,或者通过订阅self.City.Available
并设置self.City
为''
then 来执行此操作。您还需要确保将订阅self.City
更新为在更新值为 时不发出警报''
。
此外,我将您的click
事件中的一些重复功能移至第三个功能,并使这两个click
功能代理此功能。您的click
函数在做完全相同的事情,只是使用不同的数据集,所以这消除了一些代码重复。ATM 看起来很轻率,因为它只有 1 行开始,但是如果您在 City 更新中添加更多功能,这将帮助您减少错误并更快地进行更改。
我在下面的代码示例中提供了两种清除 City 值的方法,并注释掉了非订阅版本,以便参考。
var cities1 = ["Paris", "London", "Warsaw", "Moscow"];
var cities2 = ["Rome", "Paris", "Berlin", "Amsterdam"];
function MyViewModel() {
var self = this;
self.City = ko.observable();
self.City.Available = ko.observableArray();
self.City.subscribe(function (newValue) {
if(newValue != '') {
alert('City has changed to ' + newValue);
}
});
self.City.Available.subscribe(function(newValue) {
self.City('');
});
self.click1 = function () {
self.loadCityList(cities1);
};
self.click2 = function () {
self.loadCityList(cities2);
};
self.loadCityList = function(cityList) {
// clear city w/o subscription
//self.City('');
self.City.Available(cityList);
}
};
ko.applyBindings(new MyViewModel());
作为离别说明,如果您想允许城市名称使用空字符串,或者只是想要一种更强大的方法来在城市被清除时抑制更改警报,您可以向 City 添加一个 sub-observable 并在 true 和 false 之间切换. 如果你这样做了,我建议添加一个“clearCity”函数来封装所有这些逻辑。前任
function MyViewModel() {
...
self.City.isLoading = ko.observable(false);
self.City.subscribe(function (newValue)) {
if(self.City.isLoading()) {
self.City.isLoading(false);
} else {
alert('City has changed!');
}
});
...
//could also put this on city as self.City.clearCity
self.clearCity = function() {
self.City.isLoading(true);
self.City('');
}
...
}