如何清除从先前访问到视图的observableArray的内容
我有一个单页面应用程序使用淘汰赛的数据绑定。 我的单页面应用程序中的CAApproval.html视图在viewmodel代码中有一个名为AllCertificates的可见arrays。 它在页面上填充很好。 当您通过单击navigation.html部分中的链接导航离开视图,然后返回到CAApproval页面时,来自previouse访问的值仍位于AllCertificates的observableArray中,因此显示在CAApproval视图中。
每当用户返回到使用该可观察数组的CAApproval页面时,我需要清除AllCertificates的observablearray的内容,以便如果用户离开页面并返回,则observablearray的内容为空,因此不会显示数据屏幕。 这里是我的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); } });
每次用户访问该页面时,如何清除observablearray的内容(而不是在页面本身内导航时,只有在用户来自单独页面时才清除observablearray)?
只需在你的视图模型加载时调用activate函数中设置它等于nothing( 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 });
同样淘汰observableArray
有有趣的方法。 调用removeAll
来清除所有项目。
看看官方网站观察数组手册 。
self.mycertificates = ko.observableArray(['C1', 'C2']); self.mycertificates.removeAll();
对于杰里米T(没有足够的空间评论)。
第一个原因,对我来说绝对足够的是存在公开可用的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; }); }