2016-01-26 3 views
1

Я создал нокаутирующий компонент, как расслоение плотной следующим образом:объект Карта данных для просмотра функции модели с использованием ko.mapping.fromJS

define(['knockout', 'text!./details.html'], function(ko, htmlString) { 

    function detailsViewModel(params) { 
     var response = getDummyResponse(); 
     // how to extend the view model with ko.mapping.fromJS()? 
    } 

    function getDummyResponse(){ 
     return { 
      foo: 1, 
      bar: 2 
     }; 
    } 

    return { viewModel: detailsViewModel, template: htmlString }; 
}); 

Возвращенный вид модель должна быть функция-конструктор для того, чтобы быть действительным нокаута компонент.

Предположим, что getDummyResponse() возвращает большой объект, который я хочу расширить моделью просмотра, используя ko.mapping.fromJS для отображения данных.

Как бы я это сделал?

ответ

1

Ваше предположение, что вам нужно указать функцию конструктора, неверно. Есть и другие options. Тот, который я предлагаю для вашей ситуации, является фабрикой View Model.

От the relevant docs:

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

ko.components.register('my-component', { 
     viewModel: { 
      createViewModel: function(params, componentInfo) { 
       // - 'params' is an object whose key/value pairs are the parameters 
       // passed from the component binding or custom element 
       // - 'componentInfo.element' is the element the component is being 
       // injected into. When createViewModel is called, the template has 
       // already been injected into this element, but isn't yet bound. 
       // - 'componentInfo.templateNodes' is an array containing any DOM 
       // nodes that have been supplied to the component. See below. 

       // Return the desired view model instance, e.g.: 
       return new MyViewModel(params); 
      } 
     }, 
     template: ... 
    }); 

В заводском методе вы можете использовать ko.mapping, если хотите.

+0

Последующий вопрос: Как обрабатывать async-загрузку в createViewModel? Например. сделав ajax-вызов для загрузки модели, а затем вернув ее – filur

+0

Возможно, вам следует опубликовать следующий вопрос, покажите нам, что у вас есть, и какова конкретная проблема. Легче помочь вам таким образом с последующими вопросами, а не комментариями. – Jeroen

+0

(По прихоти, вы можете либо (а) убедиться, что внешняя модель просмотра так, что компонент не будет создан даже до тех пор, пока данные не будут готовы, или (б) вы начнете с модели «бланко» и при загрузке он сам загружается. - Но опять же, нам нужно увидеть ваш текущий код в новом вопросе, чтобы действительно помочь.) – Jeroen

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