2013-07-29 43 views
5

Nói rằng tôi có mảng này của các đối tượng cùng loại:Rẽ observableArray nhất định đối tượng thuộc vào quan sát

var people = [ 
    { status: 0, name: "name1"}, 
    { status: 1, name: "name2"} 
]; 

và tôi muốn nó không chỉ là observableArray, nhưng tôi cũng muốn quan sát CHỈ, nói rằng, sở hữu tư của từng đối tượng.

Hãy tưởng tượng rằng các đối tượng có thể được thêm hoặc xóa. Thuộc tính tên của bất kỳ đối tượng nào sẽ không thay đổi vì vậy tôi không thực sự cần phải quan sát tên nhưng trạng thái của mọi đối tượng có thể bị thay đổi, do đó sẽ rất tuyệt vời để làm cho nó có thể quan sát được.

Có thể ánh xạ nó với các tiện ích loại trực tiếp bằng một cú pháp hack hay tôi có phải lặp qua mọi đối tượng và ánh xạ thuộc tính trạng thái của nó thành quan sát hoặc có toàn bộ mảng và các thuộc tính của đối tượng có thể quan sát không?

Trả lời

5

Bạn có thể sử dụng ko.mapping.fromJS

var vm = ko.mapping.fromJS(people,{ 
    create: function(options){  
     return { 
      status : ko.observable(options.data.status), // observable 
      name: options.data.name, // non observable 
     } 
    } 
}); 

Bây giờ vm là một observableArray có chứa đối tượng, trong đó tình trạng là một obsevable và tên là địa điểm thường xuyên.

See fiddle

@Patryk:

Bạn có thể làm điều đó, nếu bạn có nhiều tài sản và bạn muốn chuyển đổi chỉ có một thành quan sát được.

var o = ko.mapping.fromJS(people,{create: function(options){ 
    // clone item 
    var item = ko.utils.extend(options.data, {}); 
    // replace status property by an observable 
    item.status = ko.observable(options.data.status); 
    return item; 
}}); 

See updated fiddle

Bạn cũng có thể sử dụng observe với tham số bản đồ

var mapping = { 
    create: function (options) { 
     return ko.mapping.fromJS(options.data, {'observe': ["status"]}); 
    } 
}; 
var o = ko.mapping.fromJS(people, mapping); 

See fiddle

Tôi hy vọng nó giúp.

+1

Và điều gì sẽ xảy ra nếu đối tượng có nhiều thuộc tính hơn trong đó tôi chỉ muốn một thuộc tính có thể quan sát được, tôi có cần liệt kê rõ ràng từng thuộc tính bất kể có quan sát được hay không? – patryk

+0

Đến một cái gì đó như thế này nhưng cách của bạn trông chuyên nghiệp hơn: D những gì tôi tò mò về một lần nữa là một điều đơn giản: là 'var vm = ko.mapping.fromJS (dữ liệu, {});' giống như 'var vm; ko.mapping.fromJS (dữ liệu, {}, vm); ' – patryk

+0

Cuộc gọi đầu tiên dành cho cuộc gọi ban đầu và thứ hai là để cập nhật. Cập nhật "có nghĩa là" khi bạn nhận được dữ liệu "mới" từ máy chủ và bạn cần phải cập nhật chế độ xem hiện tại. – Damien

1

tôi đề nghị sử dụng copy

vì vậy bạn có thể cung cấp hàng loạt các các thuộc tính bạn muốn không được quan sát.

var mappingPeople = { 
    'copy': ["name"] 
}; 

var mapping = { 
    create: function (opts) { 
     return ko.mapping.fromJS(opts.data, mappingPeople); 
    } 
}; 
var PeopleArr = ko.mapping.fromJS(people, mapping); 

đây là Working Demo

Cập nhật

Trong trường hợp bạn cần phải đánh dấu một tài sản như quan sát và phần còn lại sẽ được tính bình thường sau đó tôi đề nghị sử dụng observe.

đây là một cập nhật cho tôi Example sử dụng observe

+0

Điều đó vẫn khiến tôi cần phải liệt kê tất cả các thuộc tính mà tôi không muốn là các quan sát, đó là đa số. Mục tiêu của tôi là đặt tên cho những người mà tôi muốn quan sát. Tôi đã làm theo cách mà Damien đề xuất, không chính xác rõ ràng và loại trực tiếp như thế, nhưng nó hoạt động. – patryk

+0

@patryk trong trường hợp đó, bạn cần sử dụng 'quan sát' http://knockoutjs.com/documentation/plugins-mapping.html#observing_only_certain_properties_using_observe –

+0

@patryk kiểm tra cập nhật của tôi –

0

Tôi biết câu hỏi này là cũ, nhưng tôi phải đối mặt với cùng một vấn đề và tìm thấy một giải pháp đơn giản mà không cần sử dụng bất kỳ plugin.

Giả sử bạn thực hiện yêu cầu nhận và nhận được một mảng bài đăng.Đối với mỗi mục nhập, bạn có thuộc tính được gọi là "Được yêu thích", là một boolean cho biết bài đăng có được người dùng ưa thích hay không và bạn muốn làm cho thuộc tính này có thể quan sát được để bạn có thể làm việc trong một số chức năng thay đổi trạng thái của nó.

Bạn có thể làm như sau:

function ViewModel() { 
    var self = this; 
    self.posts = ko.observableArray([]); 

    $.getJSON("/api/getPosts", function(data) { 
    ko.utils.arrayForEach(data, function(post) { 
    post.Favorited = ko.observable(post.Favorited) 
    }); 
    self.posts(data) 
    }); 
} 

Bằng cách này bạn xoay sở hữu một thể quan sát được yêu thích với giá trị của nó, và bạn có thể biến bất cứ tài sản quan sát được làm điều tương tự bên trong phương pháp arrayForEach.

Các vấn đề liên quan