Чи можете ви зателефонувати ko.applyBindings, щоб прив'язати частковий вигляд?


257

Я використовую KnockoutJS і маю основний вид і модель перегляду. Я хочу, щоб у діалоговому вікні (інтерфейс jQuery) з'явився інший вигляд, до якого повинна бути пов'язана окрема дочірня модель перегляду.

HTML для вмісту діалогу витягується за допомогою AJAX, тому я хочу мати можливість зателефонувати, ko.applyBindingsколи запит завершиться, і я хочу прив’язати модель дочірнього перегляду лише на частину HTML, завантажену через ajax, у діалоговому вікні div.

Це насправді можливо чи мені потрібно завантажити ВСІ мої перегляди та переглядати моделі, коли сторінка спочатку завантажується, а потім ko.applyBindingsодин раз дзвонить ?

Відповіді:


430

ko.applyBindings приймає другий параметр, який є елементом DOM для використання в якості кореня.

Це дозволить вам зробити щось на кшталт:

<div id="one">
  <input data-bind="value: name" />
</div>

<div id="two">
  <input data-bind="value: name" />
</div>

<script type="text/javascript">
  var viewModelA = {
     name: ko.observable("Bob")
  };

  var viewModelB = {
     name: ko.observable("Ted")
  };

  ko.applyBindings(viewModelA, document.getElementById("one"));
  ko.applyBindings(viewModelB, document.getElementById("two"));
</script>

Отже, ви можете використовувати цю техніку, щоб прив'язати viewModel до динамічного вмісту, який ви завантажуєте у діалогове вікно. Загалом, ви просто хочете бути обережними, щоб не зателефонувати applyBindingsкілька разів на одні й ті ж елементи, оскільки ви отримаєте декілька обробників подій.


17
Якщо ви також хочете зняти прив'язки в якийсь момент вниз по дорозі, ви можете зателефонувати або ko.cleanNode(document.getElementById("one")прибрати речі, або ko.removeNode(document.getElementById("one")очистити речі та видалити вузол з DOM.
Майкл Беркомпас

7
Просто зауважте, що обробники подій не видалять cleanNodeі removeNodeне видалять, тому будьте обережні. У деяких випадках краще використовувати templateабо withприв'язувати до цих областей, щоб у вас з’явилися нові елементи.
RP Niemeyer

7
Наразі це щось не вистачає в КО. Ми спеціально не плануємо, щоб люди "відновлювали" розділи. Однак, KO приєднує події за допомогою jQuery, якщо на нього посилаються, тож ви можете зробити, $(element).unbind();щоб видалити всі обробники.
RP Niemeyer

5
Де задокументовані ці функції (applyBindings, cleanNode, removeNode)? Я не можу знайти їхні підписи функцій на knockoutjs.com.
EricP

2
Було б добре, якби це було десь легко знайти в документації. Я навіть не бачив згадки про це.
Тревіс Кауфман

61

Хоча відповідь Німейєр є більш правильною відповіддю на це питання, ви могли б також зробити наступне:

<div>
  <input data-bind="value: VMA.name" />
</div>

<div>
  <input data-bind="value: VMB.name" />
</div>

<script type="text/javascript">
  var viewModels = {
     VMA: {name: ko.observable("Bob")},
     VMB: {name: ko.observable("Ted")}
  };

  ko.applyBindings(viewModels);
</script>

Це означає, що вам не потрібно вказувати елемент DOM, і ви навіть можете прив’язувати кілька моделей до одного елемента, наприклад, такий:

<div>
  <input data-bind="value: VMA.name() + ' and ' + VMB.name()" />
</div>

4
Ви також можете використовувати "з", щоб виділити регіони сторінки на окремі моделі - data-bind = "with: VMA"
lexicalscope

3
@flamingpenguin: Так, але withне дешево, дивіться: посилання
mhu

7

Мені вдалося прив’язати власну модель до елемента під час виконання. Код тут: http://jsfiddle.net/ZiglioNZ/tzD4T/457/

Цікавий біт полягає в тому, що я застосовую атрибут data-bind до елемента, який я не визначав:

    var handle = slider.slider().find(".ui-slider-handle").first();
    $(handle).attr("data-bind", "tooltip: viewModel.value");
    ko.applyBindings(viewModel.value, $(handle)[0]);

у вас проблеми з ko 2.3, наведений вище код знаходиться в обробнику клієнта, який викликається, коли я застосовую глобальний ko.applyBindings (). Отож, я отримую помилку "Ви не можете застосувати прив'язки кілька разів до одного елемента." Я все ще намагаюся з’ясувати, чому я отримую помилку. Чи не можемо ми застосувати прив'язку до однієї і тієї ж змінної кілька разів, кожен до різних елементів?
ZiglioUK

Ось версія з ko 2.3, яка не працює: jsfiddle.net/ZiglioNZ/tzD4T/458
ZiglioUK

Додавання дзвінка до ko.cleanNode () перед викликом застосувати Прив’язка до часткового перегляду, здається, не допоможе: jsfiddle.net/ZiglioNZ/tzD4T/459
ZiglioUK

Вирішено: мені навіть не потрібно було дзвонити застосовувати Прив’язки!
ZiglioUK

я щойно відредагував вихідний код knockoutjs і прокоментував частину, в якій функція пригнічується "Ви не можете застосовувати прив'язки кілька разів до одного і того ж елемента.", тепер все працює нормально ... я знаю, це брудне рішення, але я новий у бібліотеці, тому Я не знаю, як не застосовувати його кілька разів для моєї проблеми.
Геоморілло

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.