Kısmi bir görünümü bağlamak için ko.applyBindings'i arayabilirsiniz?


258

KnockoutJS kullanıyorum ve ana görüş ve görünüm modelim var. Ayrı bir alt görünüm modeli bağlı olması gereken başka bir görünüm ile pop-up bir iletişim kutusu (jQuery UI bir) istiyorum.

Diyalog içeriği için HTML AJAX kullanılarak alınır, bu yüzden ko.applyBindingsistek tamamlandıktan sonra çağırabiliyorum ve alt görünüm modelini sadece diyalog div içindeki ajax aracılığıyla yüklenen HTML kısmına bağlamak istiyorum.

Bu gerçekten mümkün mü yoksa sayfa başlangıçta yüklendikten sonra bir ko.applyBindingskez aradığımda TÜM görüşlerimi yüklemem ve modelleri izlemem gerekiyor mu?

Yanıtlar:


431

ko.applyBindings kök olarak kullanılacak DOM öğesi olan ikinci bir parametreyi kabul eder.

Bu, aşağıdaki gibi bir şey yapmanıza izin verir:

<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>

Bu nedenle, bir viewModel'i iletişim pencerenize yüklediğiniz dinamik içeriğe bağlamak için bu tekniği kullanabilirsiniz. Genel olarak, applyBindingsaynı öğelerde birden çok kez arama yapmamaya dikkat etmek istiyorsunuz , çünkü birden fazla olay işleyici bağlı olacak.


17
Yolun bir noktasında bağlamaları kaldırmak isterseniz, bir ko.cleanNode(document.getElementById("one")şeyleri temizlemek veya bir ko.removeNode(document.getElementById("one")şeyleri temizlemek ve düğümü DOM'dan kaldırmak için çağrı yapabilirsiniz .
Michael Berkompas

7
Olay işleyicilerini kaldırmayacağınızı cleanNodeve removeNodekaldırmayacağınızı unutmayın , bu yüzden dikkatli olun. Bazı durumlarda, bu alanlar üzerinde templateveya withüzerinde bağlayıcı kullanılması tercih edilir , bu nedenle yeni öğeler oluşturursunuz.
RP Niemeyer

7
Şu anda KO'da eksik olan bir şey. İnsanların bölümleri "yeniden bağlamalarını" özellikle amaçlıyoruz. Ancak, başvuruda bulunulursa, KO jQuery kullanarak olayları ekler, böylece $(element).unbind();tüm işleyicileri kaldırmak için yapabilirsiniz .
RP Niemeyer

5
Bu işlevler (ApplyBindings, cleanNode, removeNode) nerede belgelenir? İşlev imzalarını knockoutjs.com'da bulamıyorum.
EricP

2
Bu kolayca belgeleri içinde locatable bir yerde olsaydı iyi olurdu. Bundan bahsetmedim bile.
Travis Kaufman

61

Niemeyer'ın cevabı sorunun daha doğru yanıt olsa da, olabilir de aşağıdakileri yapın:

<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>

Bu, DOM öğesini belirtmeniz gerekmediği ve aynı öğeye birden fazla modeli bile bağlayabileceğiniz anlamına gelir:

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

4
sayfanın bölgelerini ayrı ayrı modellere ayırmak için "ile" kullanabilirsiniz - data-bind = "ile: VMA"
lexicalscope

3
@flamingpenguin: Evet, ama withucuz değil, bkz: link
mhu

7

Çalışma zamanında bir öğeye özel bir model bağlamayı başardım. Kod burada: http://jsfiddle.net/ZiglioNZ/tzD4T/457/

İlginç olan şey, veri bağlama niteliğini tanımlamadığım bir öğeye uygulamaktır:

    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 ile ilgili sorun yaşıyorsanız, yukarıdaki kod, global ko.applyBindings () öğesini uyguladığımda çağrılan bir müşteri işleyicisindedir. Şimdi, "Aynı öğeye birden çok kez ciltleme uygulayamazsınız" hatasını alıyorum. Hala hatayı neden aldığımı anlamaya çalışıyorum. Aynı değişkene, her biri farklı öğelere birden çok kez bağlama uygulayamaz mıyız?
ZiglioUK

İşte ko 2.3 ile çalışmayan sürüm: jsfiddle.net/ZiglioNZ/tzD4T/458
ZiglioUK

Uygulamayı çağırmadan önce ko.cleanNode () öğesine bir çağrı eklemek Kısmi görünüme ciltleme
ZiglioUK

Çözüldü: ApplyBindings demeye bile gerek duymadım!
ZiglioUK

ive sadece knockoutjs kaynak kodunu düzenledi ve fonksiyonun "Aynı öğeye birden fazla kez ciltleme uygulayamazsınız" diye bir kısmını yorumladı., şimdi hepsi iyi çalışıyor ... Bu kirli bir çözüm olduğunu biliyorum ama kütüphaneye yeni im i benim sorunum için birden çok kez uygulamak için nasıl bilmiyorum.
Geomorillo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.