2013-11-19 1 views
0

здесь у меня есть пример кода, который сказал, что плагин KnockoutJS Mapping автоматически связывает пользовательский интерфейс. здесь кодКак работает плагин MappingJockoutJS

<script src="~/Scripts/knockout.mapping-latest.js"></script> 
<script type="text/javascript"> 
     $(function() { 
      var viewModel = ko.mapping.fromJS(@Html.Raw(Model.ToJson())); 
      ko.applyBindings(viewModel); 
      }); 
</script> 

предположим, мой HTML связывание следующим

<p>First name: <strong data-bind="text: firstName"></strong></p> 
<p>Last name: <strong data-bind="text: lastName"></strong></p> 

и моей стороне сервера модели возвращения JSON как

{fname:Josh;lname:Steve}; 

так вот мой вопрос, как можно было понять KnockoutJS Mapping плагин что значение fname нужно сопоставить с привязкой к базе данных firstName & lname необходимо сопоставить с databinding lastName?

Я понимаю, что я пытаюсь сказать. так что в этом случае мне будет показано, как можно связать json с html UI через плагин Mapping KnockoutJS.

в этой ситуации нокаутJS Mapping плагин был бы правильным выбором или нет?

мне нужно связать вручную viewmode как

Имя:

Фамилия:

json as follows var person = {fname:Josh;lname:Steve}; 

var viewModel = function(person) { 
    this.firstname= ko.observable(person.fname); 
    this.lastname= ko.observable(person.lname); 
}; 

ko.applyBindings(new viewModel(person)); 
+0

Если вы хотите использовать разные имена свойств в своих представлениях типа 'lastname', что у вас есть на сервере' fname', то плагин сопоставления не может вам помочь. Вам нужно вручную выполнить сопоставление, как в вашем втором примере. – nemesv

+0

спасибо ... поэтому, когда плагин сопоставления будет использовать, тогда вид на стороне сервера и вид на стороне клиента должны быть такими же .... я прав? – Thomas

+0

Плагин сопоставления создает viewModel со свойствами с теми же именами, что и модель; если у вас есть только некоторые свойства, что вы хотите иметь разные имена, вы можете расширить viewModel после сопоставления – Matus

ответ

0

В соответствии с просьбой в комментарии я ставлю это в качестве возможного ответа.

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

var viewModel = ko.mapping.fromJS(@Html.Raw(Model.ToJson())); 
var extendViewModel = function() { 
    this.firstName = ko.computed({ 
     read: function(){ 
      return viewModel.fname(); 
     }, 
     write: function(value){ 
      viewModel.fname(value); 
     }, 
     owner: viewModel 
    }); 
}; 

viewModel = ko.mapping.fromJS(new extendViewModel(), viewModel); 
ko.applyBindings(viewModel); 

Затем вы можете использовать ПгвЬЫат в разметке для привязки и ViewModel .fname также будет обновлено.

+0

спасибо за ответ, но когда будет вызвана функция чтения и записи? снова, что эта строка будет делать viewModel = ko.mapping.fromJS (new extendViewModel(), viewModel); ?? пожалуйста, обсудите в деталях. спасибо – Thomas

+0

Функции чтения и записи могут считаться getter и setter для свойства; и эта строка в основном добавляет свойства/методы из extendViewModel в viewModel – Matus