2013-02-28 2 views
8

Возможно ли вручную вставить вычисленное наблюдаемое в массив, который генерируется с помощью плагина сопоставления? Вот пример, который не использует плагин сопоставления, но я хотел бы знать, может ли он его использовать.Вставка нокаута, вычисленного в наблюдаемом массиве, который генерируется с помощью плагина ko.mapping

Допустим, у меня есть данные в формате JSON с сервера:

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

На мой взгляд, у меня есть класс Order и модель представления:

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

Можно ли использовать отображение плагин генерировать массив заказов на модели представления, а также иметь возможность вставлять вычисленное наблюдаемое «полное имя» в массив заказов?

ответ

4

Вы можете, в соответствии с 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

Спасибо, это полезно. Но я вижу только, как сделать вычисленное наблюдаемое из одного свойства данных (т. Е. Children -> nameLength). Как можно было бы вычислить наблюдаемые из двух или более свойств? –

+0

Прости, вчера вечером я отсутствовал, поэтому до сих пор не видел вашего последующего вопроса. Рад, что вы его отсортировали в конце. Технически, однако, я бы сказал, что я ответил на вопрос, который вы просили полностью, поэтому я бы подумал, что верхняя часть была наименее заслуженной! –

11

После рассмотрения документации, я успешно применил ее к моему примеру, как показано в this jsFiddle и в следующих строках:

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

ответ на бомбу! –

Смежные вопросы