2015-04-17 2 views
1

Я пытаюсь создать страницу с использованием компонентов нокаута, и у меня возникли проблемы с попыткой связать несколько компонентов на странице, если они не добавлены одновременно. Насколько я вижу, у меня нет способа прямого доступа к viewmodel компонента, чтобы привязать его к определенному элементу.Компоненты нокаута - не удается применить привязки более одного раза

ko.applyBindings(viewModel, document.getElementById("component1")); 

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

ko.applyBindings() 

, если добавить еще один компонент на страницу в более позднее время, и вы хотите, чтобы связать его, я получаю «Вы не можете применять привязки несколько раз к одному и тому же элементу». ошибка.

Есть ли способ получить доступ к модели представления компонентов и применить ее непосредственно?

$('body').append('<div id="compoent1" data-bind=\'component: { name:"someComponent"\}'></div>') 
ko.applyBindings(viewModel/*How do I get this?*/, document.getElementById("component1")); 

Я пробовал только с помощью

ko.applyBindings(document.getElementById("component1")); 

Моих объяснений, пожалуй, довольно трудно понять, вот псевдо код, что я пытаюсь сделать:

Add a knockout component 
Apply bindings for the knockout component 
.... some time later in my single page application 
Add another knockout component 
Apply bindings for the new knockout component 
+1

«Если я добавлю еще один компонент на страницу позже» Как вы добавляете компонент? Не-нокаутом образом (т. Е. С jquery или аналогичным)? – spender

+0

Вы пытаетесь использовать модель просмотра _same_? Если это в вашем коде, вы можете просто ссылаться на него - хотя есть способ получить модель представления с KO, это было бы глупо. А именно 'ko.dataFor'. –

+0

Лучше всего здесь создать [MCVE] (/ help/mcve), сейчас сложно сказать, что вы делаете, и поэтому, как мы можем помочь вам заставить его работать. –

ответ

4

кажется для меня, что вы, вероятно, пытаетесь добавить компонент, используя методы non-knockout.

Как только вы идете нокаутом, лучше держать все в нокаутном сгибе и сопротивляться искушению вернуться на jQuery или прямому манипулированию DOM для «быстрой победы». Он всегда кусает позже ... так:

<foocomponent params="woo:'fwoo'"></foocomponent > 
<!-- ko if:someBooleanObservableThatChangesLater --> 
    <myawesomecomponent params="choo:'boo'"></myawesomecomponent > 
<!-- /ko --> 

Теперь мы «добавили» второй компонент путем изменения наблюдаемой в нашей корневой модели (someBooleanObservableThatChangesLater). Не требуется повторного связывания.

Ваши обстоятельства могут несколько отличаться от моего довольно простого примера выше, но, надеюсь, намерение ясно. Вы можете получить аналогичное поведение, нажав элементы на observableArray и используя привязку foreach, чтобы содержимое было добавлено/удалено из DOM, когда вы меняете observableArray. Еще раз, второй звонок на applyBindings не требуется.

+0

Делает смысл! Я только начинаю с нокаутом, так что я все еще очень люблю мышление jQuery, я полагаю. Я попытаюсь использовать несколько логических элементов для добавления материала. Тем не менее, с несколькими «подсайтами» в SPA я считаю, что одна огромная модель просмотра будет очень грязной. – Robin

+0

Да. Я был поражен именно этой проблемой ... однако, легко уменьшить беспорядок, разделив обязанности в вашей модели представления, определив классы/фабрики, которые инкапсулируют части того, что будет большей монолитной моделью просмотра. – spender

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