2013-07-15 2 views
0

первый веб-службы: (Пользователь)Mapping JSON в Knockout наблюдаемого массива

[{ID: 1, UserName: "Йон"}]

второй веб-службы: (Message)

[{ID: 34, сообщение: "Это сообщение 1", UserId: 1}, {ID: 35, сообщение: "Это сообщение 2", UserId: 1}]

Как я могу сопоставить над двумя ko.obervableArrays, чтобы я мог получить UserName («Jhon») в своем Message ViewModel на основе UserId.

Как вы знаете UserId: 1 является внешним ключом пользователя.

Я хочу, чтобы пользователь Message и UserName что-то вроде этого.

  • данных привязывать = "текст: UserName"

  • данных привязывать = "текст: сообщение"

+0

ли две службы вытягивая из полностью отдельных источников данных? Они отображаются на бэкэнде? Наконец, вы используете EF или предоставляете свои собственные метаданные. –

+0

Обе веб-службы поступают из одного источника данных. Да Я пользовательский API EF и MVC Web. –

ответ

1

Вы можете использовать create вариант отображения плагина включать пользовательские данные, например: http://jsfiddle.net/H4QfX/

var userData = [{id:1, UserName:"Jhon"}], 
    messageData = [{id:34, Message:"This is a message 1", UserId:1}, {id:35, Message:"This is a message 2", UserId:1}]; 

var users = ko.mapping.fromJS(userData); 
var viewModel = ko.mapping.fromJS(messageData, { 
    'UserId': { 
     create: function(options) { 
      return ko.utils.arrayFirst(users(), function(u) { 
       if (u.id() == options.data) { 
        return u; 
       } 
      }); 
     } 
    }}); 

ko.applyBindings(viewModel); 
2

Если вы использовали библиотеку JavaScript, как Breeze жизнь была бы намного упрощена. Без Breeze вам нужно будет создать классы модели в JavaScript, как и в ваших классах моделей для EF. В основном вам необходимо будет поддерживать определение базовой модели, а также определение модели интерфейса, и убедитесь, что они совпадают.

Я бы очень рекомендовал посмотреть на breezejs.com, поскольку я не могу подчеркнуть, насколько это будет легче для вашей жизни. Бриз может наследовать ваши метаданные из вашего документа EF datacontext и правильно отображать все с самого начала, он работает рука об руку с нокаутом, и это сэкономит вам недели развития.

Если вы хотите, вы можете также использовать отображение Нокаут плагин Using Knockout mapping for complex JSON

+1

Я уже слышал о BreezeJS, это хорошо. Я прочитаю больше об этой структуре. Спасибо –

+0

Нокаут> Бриз – beauXjames

+0

@beauXjames Нокаут и бриз имеют две совершенно разные области проблем, они не перекрываются вообще и на самом деле работают очень хорошо вместе. Не знаете, где и как вы сформулировали свое мнение, но оно явно недостаточно хорошо информировано и собирается смутить других. –

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