问题
When wiring together Trix editor content with Livewire, I am stumbling into problems. I believe that the issue is that when Livewire receives content from Trix, the content is swapped out and Trix becomes disabled. Is there a better way?
What I have done, that works, is as follows. At the moment, the page is the redirected to itself in order to reboot Trix (defeating the whole point of Livewire, but it's being used for other things too).
<div>
<input
id="newCommentTextTrixContent"
type="hidden"
wire:model="newCommentText"
>
<trix-editor
id="newCommentTextTrixEditor"
input="newCommentTextTrixContent"
></trix-editor>
<button wire:click="addComment(document.getElementById('newCommentTextTrixEditor').innerHTML)">Add Comment</button>
</div>
I have tried
- wire:model on the hidden input -- nothing happens
- x-on:trix-change="$set('comment', $event.target.innerHTML) -- this works, but Trix goes grey and ceases to work after the first keypress (reboot problem?)
I'm sure something like the latter is better, but with Trix somehow being rebooted each time. It all seems a bit messy - so the question is, what's the right way to do this?
回答1:
I got it working. You probably need a recent version of Livewire to get this to work, but the code is roughly as follows.
<div wire:ignore>
<trix-editor
class="formatted-content"
x-ref="trix"
wire:model.debounce.999999ms="newCommentText"
wire:key="uniqueKey"
></trix-editor>
</div>
Why does this work?
- You need
wire:ignore
on the parent node, because Trix inserts the toolbar above the text area.wire:ignore
stops Livewire from worrying about it and therefore not removing it or messing with it on the next cycle. - You need a wire:key because the DOM moves around a bit, and this helps Livewire to keep track of it.
- I propose the long debounce, which is a hack as the
.lazy
modifier doesn't work well with text. Also, waiting for Ajax on each key press is painful.
That's it. I use this above to repetitively submit comments onto the end of a comment stream, and everything seems to work fine. Good luck!
Note, I also have CKEditor working similarly, as described here.
回答2:
As an extension on @Kurucu 's answer, and the comment under it from @Rehan;
This seems to work very well. But when I apply styles like li or bold it doesnt retain in the wire:model. Ex:
<div>foo<br>bar<br>foobar</div>
I applied the Bullets here the tags are missing. Did you face this issue? – Rehan
To fix the issue of not having an updated value when pressing buttons bold, italic, or quote for example, add the following part to the trix editor (note the x-on:trix-change="$dispatch('input', event.target.value)"
):
<div wire:ignore>
<trix-editor
class="formatted-content"
x-data
x-on:trix-change="$dispatch('input', event.target.value)"
wire:model.debounce.1000ms="newCommentText"
wire:key="uniqueKey"
></trix-editor>
</div>
回答3:
I got it to work by using Trix's built-in events.
<input id="about" name="about" type="hidden" value="{{ $about }}">
<trix-editor input="about" class="wysiwyg-content"></trix-editor>
<script>
var about = document.getElementById("about")
addEventListener("trix-change", function(event) {
console.log(about.getAttribute('value'));
@this.set('about', about.getAttribute('value'))
})
</script>
来源:https://stackoverflow.com/questions/60539739/is-there-a-proper-way-to-wire-up-trix-editor-with-livewire