knockout.js - observablearray - Cómo borrar el contenido de un array observable que se llenó de visitas anteriores a una vista
ko js value update (3)
Para Jeremy T (no hay suficiente espacio en el comentario).
La primera razón y absolutamente suficiente para mí es la existencia de API públicamente disponible para el propósito deseado.
Pero para estimar el rendimiento puede verificar la fuente. "observableArray" también es "observable" con funciones adicionales inyectadas en el objeto.
Entonces la inicialización se ve así:
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;
}
Y eliminar todos los elementos se ve así:
''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;
});
}
Tengo una aplicación de una sola página que utiliza un knockout para el enlace de datos. La vista CAApproval.html en mi aplicación de una sola página tiene una matriz observable llamada AllCertificates en el código de viewmodel. Se puebla bien en la página. Cuando navega fuera de la vista haciendo clic en un enlace en la parte navigation.html de la página y luego regresa a la página CAApproval, los valores de la visita de visita de ubicación todavía están en AllCertificates observableArray y, por lo tanto, se muestran en la vista de aprobación de CA.
Necesito borrar el contenido de AllCertificates observablearray cada vez que un usuario regrese a la página CAApproval que usa ese array observable para que si un usuario abandona la página y vuelve, el contenido de la matriz observable es nulo, y por lo tanto no se muestran datos en la pantalla. Estos son los aspectos más destacados de mi código de modelo de vista:
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);
}
});
¿Cómo borro los contenidos de un array observable cada vez que la página llega a esa página (NO cuando navegas dentro de la página, solo borras el array observable cuando el usuario viene de una página separada)?
Simplemente allCertificates([])
igual a nada ( allCertificates([])
) en su función de activación, que se allCertificates([])
cada vez que se cargue su modelo de vista -
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
});
También knockout observableArray
tiene métodos interesantes. Llame a removeAll
para borrar todos los elementos.
Mire el manual de la matriz observable del sitio oficial.
self.mycertificates = ko.observableArray([''C1'', ''C2'']);
self.mycertificates.removeAll();