我有一個顯示在頁面中的用戶數組。而且我有一對輸入文本框來過濾名稱和姓氏顯示的用戶。 我希望當輸入文本字段中的任何值發生更改時,用戶數組都會更新。淘汰賽。如何在可觀察更新前後執行自定義代碼
這裏是我有才達到該代碼:
淘汰賽視圖模型:
function HomeViewModel() {
var self = this;
self.users = ko.observableArray([]);
self.FilterByName = ko.observable('');
self.FilterByLastName = ko.observable('');
self.FilteredUsers = ko.observableArray([]);
self.FilteredUsersComputed = ko.computed(function() {
var result = self.users().filter(function (user) {
return (user.name.toUpperCase().includes(self.FilterByName().toUpperCase()) &&
user.lastName.toUpperCase().includes(self.FilterByLastName().toUpperCase())
);
});
self.FilteredUsers(result);
});
$.getJSON("/api/User", function (data) {
self.users(data);
});
}
ko.applyBindings(new HomeViewModel());
HTML:
<div>
<label>Name:</label>
<input data-bind="textInput: FilterByName" />
</div>
<div>
<label>Lastname:</label>
<input data-bind="textInput: FilterByLastName" />
</div>
(...)
<div id="LLAdminBodyMain" class="container">
<div class="row justify-content-center" data-bind="foreach: FilteredUsers">
<div class="col-md-6 col-lg-4">
<p data-bind="text: name"></p>
</div>
</div>
</div>
問題:
現在我想要得到的以下影響:
- 延遲執行
FilteredUsers
「計算的函數,以便在每次在名稱或姓氏字段中按下鍵時不觸發。即:等待2秒鐘沒有按鍵事件;或者在kepress之後等待1或2秒以執行計算的功能。 - 當
FilteredUsers
被觸發時,首先淡出LLAdminBodyMain
,然後更新FilteredUsers
,然後使用新元素淡入LLAdminBodyMain
。
要做到這一點,我認爲知道如何檢測knockout是否要更新observable並在更新並傳播新值之前執行我的自定義代碼會很有用。
我試過做類似的事情,但下面的代碼不起作用:淘汰賽不再檢測到變化。
self.FilteredUsersComputed = ko.computed(function() {
console.log("In");
$("#LLAdminBodyMain").fadeOut(function() {
var result = self.users().filter(function (user) {
return (user.name.toUpperCase().includes(self.FilterByName().toUpperCase()) &&
user.lastName.toUpperCase().includes(self.FilterByLastName().toUpperCase())
);
});
self.FilteredUsers(result);
}).delay(1000).fadeIn();
});
謝謝。
http://knockoutjs.com/documentation/rateLimit-observable.html –