Как очистить содержимое наблюдаемого массива, которое было заполнено из предыдущих посещений в представлении
У меня есть одностраничное приложение, которое использует нокаут для привязки данных. В представлении CAApproval.html в моем одностраничном приложении есть наблюдаемый символ с именем AllCertificates в коде viewmodel. Он заполняется на странице. Когда вы переходите от просмотра, щелкнув ссылку в части navigation.html страницы и затем вернитесь на страницу CAApproval, значения из посещения previouse все еще находятся в наблюдаемом массиве AllCertificates и поэтому отображаются в представлении CAApproval.
Мне нужно очистить содержимое AllCertificates observablearray каждый раз, когда пользователь возвращается на страницу CAApproval, которая использует этот наблюдаемый символ, чтобы, если пользователь покидает страницу и возвращается, содержимое наблюдаемого символа равно null, и поэтому данные отсутствуют отображается на экране. Вот основные моменты моего кода viewmodel -
define(['services/logger', 'durandal/system', 'durandal/plugins/router', 'services/CertificateDataService','controls/Lucas'],
function(logger, system, router, CertificateDataService) {
var allCertificates = ko.observableArray([]);
var activate = function () {
// go get local data, if we have it
return SelectAllCerts(),SelectMyCerts(), GetCertificateDetails(), GetDDABankNums();
};
var vm = {
activate: activate,
allCertificates: allCertificates,
SelectAllCerts: SelectAllCerts
});
return vm;
function SelectAllCerts() {
return CertificateDataService.getallCertificates(allCertificates);
}
});
Как очистить содержимое наблюдаемого символа каждый раз, когда страница пользователя попадает на эту страницу (НЕ при навигации по самой странице, только очистить наблюдаемый символ, когда пользователь приходит с отдельной страницы)?
Ответы
Ответ 1
Просто установите его равным ничто (allCertificates([])
) в вашей функции активации, которая вызывается каждый раз, когда загружается ваша модель просмотра -
function(logger, system, router, CertificateDataService) {
var allCertificates = ko.observableArray();
var activate = function () {
allCertificates([]);
// go get local data, if we have it
return SelectAllCerts(),SelectMyCerts(), GetCertificateDetails(), GetDDABankNums();
};
var vm = {
activate: activate,
allCertificates: allCertificates,
SelectAllCerts: SelectAllCerts
});
Ответ 2
Также нокаут observableArray
имеет интересные методы. Вызовите removeAll
, чтобы удалить все элементы.
Посмотрите официальный сайт руководство для наблюдаемого массива.
self.mycertificates = ko.observableArray(['C1', 'C2']);
self.mycertificates.removeAll();
Ответ 3
Для Джереми Т (недостаточно места в комментариях).
Первая причина и достаточно для меня - это наличие общедоступного API для желаемой цели.
Но для оценки производительности вы можете проверить источник.
"observableArray" также "наблюдаемый" с дополнительными функциями, вводимыми в объект.
Итак, инициализация выглядит следующим образом:
ko.observableArray = function (initialValues) {
initialValues = initialValues || [];
if (typeof initialValues != 'object' || !('length' in initialValues))
throw new Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");
var result = ko.observable(initialValues);
ko.utils.extend(result, ko.observableArray['fn']);
return result.extend({'trackArrayChanges':true});
};
ko.observable = function (initialValue) {
var _latestValue = initialValue;
function observable() {
if (arguments.length > 0) {
// Write
// Ignore writes if the value hasn't changed
if (!observable['equalityComparer'] || !observable['equalityComparer'](_latestValue, arguments[0])) {
observable.valueWillMutate();
_latestValue = arguments[0];
if (DEBUG) observable._latestValue = _latestValue;
observable.valueHasMutated();
}
return this; // Permits chained assignments
}
else {
// Read
ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a "read" operation
return _latestValue;
}
}
if (DEBUG) observable._latestValue = _latestValue;
ko.subscribable.call(observable);
observable.peek = function() { return _latestValue };
observable.valueHasMutated = function () { observable["notifySubscribers"](_latestValue); }
observable.valueWillMutate = function () { observable["notifySubscribers"](_latestValue, "beforeChange"); }
ko.utils.extend(observable, ko.observable['fn']);
ko.exportProperty(observable, 'peek', observable.peek);
ko.exportProperty(observable, "valueHasMutated", observable.valueHasMutated);
ko.exportProperty(observable, "valueWillMutate", observable.valueWillMutate);
return observable;
}
И удалить все элементы выглядят так:
'removeAll': function (arrayOfValues) {
// If you passed zero args, we remove everything
if (arrayOfValues === undefined) {
var underlyingArray = this.peek();
var allValues = underlyingArray.slice(0);
this.valueWillMutate();
underlyingArray.splice(0, underlyingArray.length);
this.valueHasMutated();
return allValues;
}
// If you passed an arg, we interpret it as an array of entries to remove
if (!arrayOfValues)
return [];
return this['remove'](function (value) {
return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
});
}