Я сделал что-то похожее на то, что, как я думаю, вы хотите сделать.
Что я делаю, это создавать модели просмотра на сервере, сериализовывать их в json и использовать плагин сопоставления для создания моделей представления Knockout.
У меня есть общий базовый класс в классах C# и реализации, которые имеют различные структуры данных. Тогда я определяю поведение только в нокауте.
Что-то вроде этого:
public abstract MyBase : IDefineMyBase {
public string Type { get { return this.GetType().Name; } }
}
public class MyFirstEditModel : MyBase {
public string Something { get; set; }
}
Я использую ASP.NET MVC, чтобы служить этому нокаутировать:
public ActionResult MyAction() {
var model = {
EditModels = new IDefineMyBase[] {
new MyFirstEditModel {
Something = "Some thing"
},
... other implementations
}
};
// AsJson is a serialization extension method
return View("MyView", (object)model.AsJson());
}
В Knockout, я использую это так:
// This is a behaviour base "template" that will be applied for all editmodels
var editModel = function(data) {
// Map the edit model specific data to *this*
ko.mapping.fromJS(data, {}, this);
// Apply implementation specific behaviour to this instance of the model
eval(this.Type() + '(this)'); // example: MyFirstEditModel(this);
}
// This is specific behaviour for MyFirstEditModel
var MyFirstEditModel = function(base) {
base.someBindableSpecificFunction = function() {
// You can use data from the implementation here.
alert(base.Something());
};
}
// This is the base view model where you can have all the main functionality
var viewModel = function(base) {
ko.utils.arrayForEach(data.EditModels(), function (editModel) {
s.Parent = base;
// example: base.MyFirstEditModel = editModel;
eval('base.' + s.Type() + ' = editModel');
});
}
// This is mapping instructions
var mapping = {
'EditModels': {
create: function (options) {
return new editModel(options.data);
}
}
};
$(document).ready(function() {
// Map the server side model to knockout
var mapped = ko.mapping.fromJS(@Html.Raw(Model), mapping, vm);
// Add behaviour to the mapped data
viewModel(mapped);
ko.applyBindings(vm);
});
Хм. Это оказалось немного кода. Вот как я преодолеваю разрыв между сервером и клиентом, сохраняя возможность выбирать модели, основанные на имени типа и тому подобном. Это также позволяет мне определять структуры данных на сервере, определяя поведение конкретного представления в моделях представления нокаутов. Плагин сопоставления немного волшебный, но один из недостатков заключается в том, что вы не видите структуру данных в моделях с нокаутом, но я это принял. Кроме того, обратите внимание, что оболочка имен отличается, и если вы не можете выдержать, что сериализатор Newtonsofts Json может изменить оболочку при сериализации. Я решил не делать этого, так как он помогает мне понять, что из сервера и что я определил в моделях просмотра.
Вы хотите добиться чего-то вроде этого: http://stackoverflow.com/questions/6706281/knockoutjs-can -we-create-a-dependentobservable-function-with-a-parameter – Subodh
Не совсем нет, я хочу привязать Edit ViewModel к различным представлениям (разные html-шаблоны) в зависимости от типа типа viewmodel. – Anders