2011-11-02 27 views
7

Cách thêm tất cả các giá trị vào observableArray trong một lần? Thêm giá trị trong vòng lặp hoạt động rất chậm trong trường hợp của tôi. Đây là ví dụ jsfiddle. jsfiddleknockout observableArray performance

+0

tôi có một lưu ý về các mục thêm vào một vấn đề hiệu suất mảng mà bạn nên sử dụng array_name [array_name.length-1] = hàng của bạn; dòng này là nhanh hơn so với phương pháp đẩy – Marwan

+0

Sự khác biệt thực sự lớn? – Neir0

+0

Tôi nghĩ vậy hãy xem bài viết này http://www.scottlogic.co.uk/2010/10/javascript-array-performance/ và xin lỗi tôi đã nhầm lẫn array_name [array_name.length] = mục của bạn – Marwan

Trả lời

7

Vì bạn đang giải phóng ra toàn bộ mảng thể quan sát được, một cách để bạn có thể thực hiện điều này là:

var viewModel = { 
    name: "base", 
    addingValue:new ko.observable(), 
    someArr: new ko.observableArray(["123","432","sdafasd","xrere"]), 
    add: function() 
    { 
     this.someArr.push(this.addingValue()); 
    }, 
    updateSomeArr:function() 
    { 
     var temp = []; 

     for(var i=0;i<5;i++) 
     { 
      temp.push("555565"); 
     } 

     this.someArr(temp); 
    } 
} 
+0

haha ​​khá đơn giản. Cảm ơn – Neir0

+0

Không sao cả. Ngoài ra còn có một cách để "tắt" các hành vi quan sát, cập nhật mô hình của bạn, và sau đó bật nó trở lại - nhưng tôi dường như không thể tìm thấy trang cho nó. –

+0

sử dụng array_name [array_name.length-1] = item; là nhanh hơn so với phương pháp push – Marwan

3

Hiện đã là một câu trả lời được lựa chọn, nhưng tôi nghĩ rằng sau đây sẽ giúp đỡ. Bạn có thể vô hiệu hóa các hành vi quan sát bằng cách thực hiện mảng quan sát của bạn để có được việc thực hiện mảng cơ bản:

var underlyingArray = viewModel.someArr(); 

Sau đó bạn có thể thêm các mục vào underlyingArray mà không bắn ra someArr sự kiện. Một khi bạn đã hoàn tất thêm các mục, hãy gọi:

viewModel.someArr.valueHasMutated(); 

Điều này sẽ gây ra sự kiện để bắn thông báo cho tất cả các quan sát phụ thuộc vào viewModel.someArr().

17
var myArray = ko.observableArray([]); 
var valuesToInsert = [1,2,3]; 
myArray.push.apply(myArray, valuesToInsert); 

đó là nó

+0

Muốn biết lý do tại sao câu trả lời đã được giảm giá. – AGS

+0

Vẫn không hiểu tại sao câu trả lời chính xác và thanh lịch nhất lại bị bỏ qua :). Xin cảm ơn vì lời giải thích. – AGS

+1

Đây thực sự là cách tiếp cận tốt nhất để đẩy tất cả các mục vào một mảng cùng một lúc. Đây là bài đăng về cách sử dụng của nó http://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html –