Компоненты нокаута внутри foreach и шаблоны

Так что с введением компонентов и пользовательских элементов кажется намного проще инкапсулировать вашу логику и разметку, однако я немного не уверен, как использовать компоненты в разделах foreach, когда вам нужно передать в модель представления.

Итак, мой текущий сценарий состоит в том, что у меня есть модель представления, которая выглядит примерно так:

function SomePartialViewModel()
{
    this.Name = ko.observable();
    this.Score = ko.observable();
    this.SomeDate = ko.observable();
}

function SomeViewModel()
{
    this.DataFromWebServiceCall = ko.observableArray();

    this.GetDataFromServer = function(){
        // get some data from service and populate DataFromWebSeriviceCall with instances of SomePartialViewModel
    }
}

Теперь в приведенном выше примере у нас есть POJO для хранения частичных данных, и у нас есть модель основного представления для представления, которое будет связываться с веб-службой или чем-то еще и заполнять его массив экземплярами частичного представления. Тогда это в настоящее время будет использоваться так:

<div id="partial-data" data-bind="template: { name: 'partial-view', foreach: DataFromWebServiceCall }"></div>

<div class="partial-view">
    <label data-bind="text: Name"></label>
    <label data-bind="text: Score"></label>
    <label data-bind="text: SomeDate"></label>
</div>

Теперь предположим, что .partial-view находится в теге сценария с правильным именем шаблона и т. д. и является правильным шаблоном, то #partial-data находится в главном окне и хочет отобразить все экземпляры на странице. Сейчас все это работает, но я бы хотел перейти к модели, основанной на более компонентах, и в настоящее время мы видим, что шаблон опирается на данные SomePartialViewModel, поэтому у нас есть наш шаблон и наша модель представления для этого компонента, однако проблема заключается в том, что получение viewmodel в компонент, так как в данный момент вы регистрируете компонент во время установки, а затем используете params для заполнения его фрагментов. Однако в этом случае я хочу передать viewmodel компоненту во время привязки...

Поэтому мне было интересно, как я могу это сделать, так как я представляю, что могу зарегистрировать компонент с шаблоном, но без модели представления, но есть ли понятие data привязка стиля, где я могу установить $data свойство и перейти на foreach из привязки шаблона к представлению?

Надеюсь, что проблема, которую я пытаюсь решить, будет видна, и любая информация будет отличной.

2 ответа

Существует множество способов передачи значений и / или моделей представления компонентам с использованием params,

Если вы используете createViewModel Метод, вы можете просто передать viewmodel через параметры и использовать частичную viewmodel в качестве компонента viewmodel:

ko.components.register("partial-view", {
    viewModel: {
        createViewModel: function (params) {
            return params.value;
        }
    },
    template: "<div>Partial View for <b data-bind='text: Name'></b></div>"
});

Вы можете увидеть рабочий пример в этой скрипке: http://jsfiddle.net/Quango/fn1ymf9w/

Вы можете определить viewModels под viewModels:)

точно так же, как и для определения наблюдаемой, вы можете определить другую viewModel, а с помощью привязки "с" вы можете создать желаемую компонентную модель.

Сначала вы создаете свои компоненты и подкомпоненты, под-под-под-компоненты и т. Д. Отдельно.

var SomePartialViewModel = function()
{
    this.Name = ko.observable();
    this.Score = ko.observable();
    this.SomeDate = ko.observable();
}

var SomeViewModel = function()
{
    this.DataFromWebServiceCall = ko.observableArray();

    this.GetDataFromServer = function(){
        // get some data from service and populate DataFromWebSeriviceCall with instances of SomePartialViewModel
    }

    this.SPM = new SomePartialViewModel(); // partial-1
}

А затем вы создаете MainViewModel и привязываете все основные элементы здесь.

var MainViewModel =  function() {

    var self = this;

    self.SVM = new SomeViewModel();

    self.SPM = new SomePartialViewModel(); // partial-2
}
ko.applyBindings(new MainViewModel());

затем в своем html вы можете создавать свои компоненты, подчиняясь контексту, который вы создали для объектов с выбыванием

    ...

    <body>
    <div data-bind="with: SVM">
        ....
        <div data-bind="with: SPM">
            <!-- partial-1 data -->
        </div>
        ...
    </div>


    <div data-bind="with: SPM">
        <!-- partial-2 data -->
    </div>
    </body>
...

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

Другие вопросы по тегам