2013-09-05 30 views
36

Tôi có một ứng dụng trang đơn sử dụng loại trực tiếp cho các ràng buộc dữ liệu. Khung nhìn CAApproval.html trong ứng dụng trang đơn của tôi có một bộ quan sát có tên là AllCertificates trong mã khung nhìn. Nó điền tốt trên trang. Khi bạn điều hướng khỏi chế độ xem bằng cách nhấp vào liên kết trong phần navigation.html của trang và sau đó quay lại trang CAApproval, các giá trị từ lượt truy cập trước vẫn ở trong chế độ xem AllCertificates observableArray và do đó được hiển thị trên chế độ xem CAApproval.Làm thế nào để xóa nội dung của một observableArray đó đã được dân cư từ lần truy cập trước đến một View

Tôi cần xóa nội dung của khung nhìn AllCertificates observablearray mỗi lần người dùng quay lại trang CAApproval sử dụng Observablearray đó để nếu người dùng rời khỏi trang và quay trở lại, nội dung của Observablearray rỗng và do đó không dữ liệu được hiển thị trên màn hình. Dưới đây là những điểm nổi bật của viewmodel tôi số-

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); 
     } 
    }); 

Làm thế nào để xóa các nội dung của một observablearray mỗi lần trang người dùng đến trang đó (KHÔNG khi điều hướng trong trang riêng của mình, chỉ xóa observablearray khi người dùng đến từ một trang riêng biệt)?

Trả lời

31

Chỉ cần đặt nó bằng gì (allCertificates([])) trong chức năng kích hoạt của bạn, được gọi là mỗi lần mô hình xem bạn tải -

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 
}); 
+0

Perfect! Cảm ơn. Vẫn đang sử dụng để loại trực tiếp. – Chris

+0

Chà. Tôi đã tìm kiếm một câu trả lời tương tự trong hơn 2 ngày nay. Cám ơn bạn rất nhiều về điều này. –

56

Cũng knockout observableArray có phương pháp thú vị. Gọi removeAll để xóa tất cả các mục.
Nhìn vào trang web chính thức observable array manual.

self.mycertificates = ko.observableArray(['C1', 'C2']); 
self.mycertificates.removeAll(); 
+4

Bất kỳ lợi ích hiệu suất nào cho câu trả lời này hoặc câu trả lời của PW Kad? –

+2

Ít nhất điều này dễ đọc hơn. – Nisarg

3

Đối với Jeremy T (không đủ khoảng trống trong nhận xét).
Lý do đầu tiên và hoàn toàn đủ cho tôi là sự tồn tại của API công khai có sẵn cho mục đích mong muốn.

Nhưng để ước tính hiệu suất, bạn có thể kiểm tra nguồn. "observableArray" cũng là "quan sát" với các hàm bổ sung được tiêm vào đối tượng.

Vì vậy, khởi trông như thế này:

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; 
} 

Và loại bỏ tất cả các yếu tố như sau:

'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; 
     }); 
    } 
Các vấn đề liên quan