マイケル・ベストが指摘しているように、都市は実際には変わっていません。あなたの都市がそれ自体がビューモデルである場合、あなたが説明することは自動的に起こります。
ただし、プリミティブがあるだけなので、配列が変更されたときに都市の現在の値を「クリア」するようにviewmodelに明示的に指示する必要があります。次に、最初の要素が自動的に選択されます。
これを行うには、クリックイベントでに設定self.City
するか、をサブスクライブして設定します。また、更新された値がであるときにアラートを出さないように、サブスクリプションを更新することを確認する必要があります。''
self.City.Available
self.City
''
self.City
''
さらに、click
イベントで繰り返される機能の一部を3番目の関数に移動し、2つの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にサブオブザーバブルを追加して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('');
}
...
}