2012-03-16 3 views
1

В других API MVVM для других фреймворков, например Caliburn Micro для WPF, вы можете использовать модели подкласса. В качестве примера у меня есть эта модель представленияKnockoutjs и «подклассификация» моделей вида

Customer 
Id : int 
Selected : bool 
Name : string 
Edit : ViewModel 

В зависимости от различных типов клиентов я иметь различные Edit ViewModels, в Caliburn микро он бы автоматически вынесший правильный вид в зависимости от типа ViewModel, типы Offcourse не присутствовать в JS, но можете ли вы добиться этого в нокаут?

+0

Вы хотите добиться чего-то вроде этого: http://stackoverflow.com/questions/6706281/knockoutjs-can -we-create-a-dependentobservable-function-with-a-parameter – Subodh

+0

Не совсем нет, я хочу привязать Edit ViewModel к различным представлениям (разные html-шаблоны) в зависимости от типа типа viewmodel. – Anders

ответ

1

Спасибо, Майк, ваше решение не совсем то, что мне нужно, Im делает что-то подобное на стороне сервера, но наши json-объекты читаются из репозитория модели чтения CQRS.

Оказывается, что названные шаблоны было то, что я был после .. Heres немного скрипки, которая показывает, что я сделал (в нашем реальном сценарии свойство подмодели будет на реальном объекте заказчика)

http://jsfiddle.net/Z7gMN/1/

Обновление: Только что увидел, что этот ответ поднят.Есть более элегантные способы сделать это, например, использовать мою конвенцию по библиотеке конфигурации нашла здесь

https://github.com/AndersMalmgren/Knockout.BindingConventions

Он имеет соглашение для шаблонов, который использует тип, поэтому используйте OO рисунок своего вкуса, как этот

http://ejohn.org/blog/simple-javascript-inheritance/

Определение различных типов, важно то, что они оканчиваются с модели или ViewModel

Шаблоны должны иметь такое же имя, но оканчиваются Посмотреть

<script type="text/html" id="MyView"> 
    <input data-name="myValue" /> 
</script> 

http://jsfiddle.net/JKXaX/5

0

Я сделал что-то похожее на то, что, как я думаю, вы хотите сделать.

Что я делаю, это создавать модели просмотра на сервере, сериализовывать их в 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 может изменить оболочку при сериализации. Я решил не делать этого, так как он помогает мне понять, что из сервера и что я определил в моделях просмотра.

+0

Я использую отдельный кусок html для шаблона (а не шаблоны jquery/ko), и используйте привязку, подобную так: with: MyFirstEditModel'. Для обычных вещей внутри этого фрагмента вы можете вызвать ko шаблоны. –

+0

Хм, хорошо, я надеялся, что у них будет что-то встроенное, похоже на довольно стандартное поведение MVVM, которое вы хотите динамическое связывание шаблонов просмотров ... oh well – Anders

+0

Вы можете вызвать шаблоны ko из кода, который может помочь в вашем случае , –

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