Saya ingin menggunakan properti di ViewModel saya untuk beralih ikon mana yang akan ditampilkan tanpa membuat properti yang dihitung secara terpisah dari invers. Apakah ini mungkin?
<tbody data-bind="foreach: periods">
<tr>
<td>
<i class="icon-search" data-bind="visible: !charted, click: $parent.pie_it"></i>
<i class="icon-remove" data-bind="visible: charted, click: $parent.pie_it"></i>
</td>
</tr>
</tbody>
ViewModel saya memiliki periode properti yang merupakan array bulan, seperti ini:
var month = function() {
this.charted = ko.observable(false);
};
knockout.js
agradl
sumber
sumber
Jawaban:
Saat menggunakan observable dalam ekspresi Anda perlu mengaksesnya sebagai fungsi seperti:
visible: !charted()
sumber
hidden
binding di v3.5.0Saya setuju dengan komentar John Papa bahwa harus ada
hidden
ikatan bawaan. Ada dua manfaat darihidden
pengikatan khusus :hidden: charted
bukannyavisible: !charted()
.charted
secara langsung, daripada membuat acomputed
untuk diamati!charted()
.Cukup sederhana untuk membuat
hidden
penjilidan, seperti ini:Anda dapat menggunakannya seperti
visible
penjilidan bawaan:sumber
return !ko.utils.unwrapObservable(valueAccessor());
hidden
pengikatan per komentar Anda. (BTW, saya menggunakan CoffeeScript dalam proyek saya pada saat saya memposting ini awalnya. Sintaks CoffeeScript tidak membuatnya jelas ketika pengembalian disengaja.)Agak membingungkan, seperti yang harus Anda lakukan
jadi saya lakukan
model saya
Check in fiddle http://jsfiddle.net/khanSharp/bgdbm/
sumber
Anda dapat menggunakan sakelar / penjilid kasus saya , yang mencakup
case.visible
dancasenot.visible
.Anda juga bisa memilikinya
sumber
Untuk membuat ikatan menyadari perubahan pada properti, saya menyalin handler pengikat yang terlihat dan membaliknya:
sumber
Penafian: solusi ini hanya untuk tujuan hiburan.
sumber
Saya memiliki masalah yang sama tentang bagaimana menggunakan kebalikan dari boolean yang dapat diamati. Saya telah menemukan solusi mudah:
Sekarang pada HTML Anda, Anda harus melakukan ini
Ketika program dimulai hanya "Text1" yang terlihat karena "false === false is TRUE" dan Text2 tidak terlihat.
Katakanlah kita memiliki tombol yang memanggil collectPlacesData pada acara klik. Sekarang Text1 tidak akan terlihat karena "true === false is FALSE" dan Text 2 hanya dapat terlihat.
Solusi lain yang mungkin bisa menggunakan komputasi teramati tetapi, saya pikir adalah solusi yang terlalu rumit untuk masalah yang sangat sederhana.
sumber
Juga dapat menggunakan disembunyikan seperti ini:
sumber