2013-02-28 22 views
8

Czy można ręcznie wstawić obliczone observable do tablicy wygenerowanej za pomocą wtyczki mapowania? Oto przykład, który nie używa wtyczki mapowania, ale chciałbym wiedzieć, czy mógłby z niego skorzystać.Wstawianie wyliczonego obliczenia możliwe do zaobserwowania w obserwowalnej tablicy, która jest generowana za pomocą wtyczki ko.mapping.

Powiedzmy mam danych JSON z serwera:

[{ 
    "OrderID":1, 
    "FirstName":"Bill", 
    "LastName":"Smith", 
},{ 
    "OrderID":2, 
    "FirstName":"Jeff", 
    "LastName":"Evans", 
} 
{ 
    "OrderID":3, 
    "FirstName":"Dan", 
    "LastName":"Johnson", 
}] 

Na moim zdaniem mam klasę zamówienie i model wyświetlania:

function Order(order) { 
    var self = this; 
    self.OrderID = ko.observable(order.OrderID); 
    self.FirstName = ko.observable(order.FirstName); 
    self.LastName = ko.observable(order.LastName); 

    /*This is what I want to insert after the mapping plugin 
    generates "orders on the ViewModel*/ 
    self.FullName = ko.computed(function() { 
     return self.FirstName() + ' ' + self.LastName(); 
    }); 

} 

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

//Get orders 
    $.ajax({ 
    url: '@Url.Action("orders")', 
    type: "post", 
    success: function (data) { 
     var mappedOrders = $.map(data, function (item) { return new Order(item) }); 
     self.orders(mappedOrders); 
    } 
    })  
} 

jest to możliwe do korzystania z wtyczki mapowania wygenerować tablicę zamówień w modelu widoku, a także umieć wstawić obliczoną obserwowalną "FullName" w tablicy zamówień?

Odpowiedz

4

Można, według documentation:

var mapping = { 
    'children': { 
     create: function(options) { 
      return new myChildModel(options.data); 
     } 
    } 
} 

var myChildModel = function(data) { 
    ko.mapping.fromJS(data, {}, this); 

    this.nameLength = ko.computed(function() { 
     return this.name().length; 
    }, this); 
} 

var viewModel = ko.mapping.fromJS(data, mapping); 
+0

Dziękuję to jest pomocne. Ale widzę tylko, jak sprawić, aby obliczone obserwowalne z jednej właściwości danych (tj. Dzieci -> nameLength). Jak można byłoby obliczyć obliczone z dwóch lub więcej właściwości? –

+0

Niestety, nie było mnie wczoraj wieczorem, więc nie widziałem do tej pory Twojego pytania. Cieszę się, że masz to posortowane na końcu. Technicznie rzecz biorąc, odpowiedziałbym, że odpowiedziałem na pytanie, które zadawałeś całkowicie, więc pomyślałem, że upominek był najmniej zasłużony! –

11

Po zapoznaniu się z dokumentacją, ja z powodzeniem stosować go na moim przykładzie, jak wykazano w this jsFiddle oraz w następujących liniach:

var data = [{ 
    OrderID: '1', 
    FirstName: 'Bob', 
    LastName: 'Stevens' 
}, { 
    OrderID: '2', 
    FirstName: 'Jim', 
    LastName: 'Johnson' 

}]; 

function order(data) { 
    var self = this; 
    var model = ko.mapping.fromJS(data, {}, self); 
    model.FullName = ko.computed(function() { 
     return self.FirstName() + ' ' + self.LastName(); 
    }); 
    return model; 
} 

var mapping = { 
    create: function (options) { 
     return new order(options.data); 
    } 
}; 

function viewModel() { 
    var self = this; 
    self.orders = ko.mapping.fromJS(data, mapping); 
} 

var vm = new viewModel(); 

ko.applyBindings(vm); 
+1

Odpowiedź bomba !! –