我正在使用Backbone.js。在我看來,我有一個textarea
其keyup
勢必這樣的功能(以下但見編輯):當keyup觸發保存時保持光標位置的最佳做法
this.model.save({text: self.$('textarea').val()}, {patch: true});
在視圖中的initialize
功能,我綁定模型的change
事件視圖的render
功能:
initialize: function() {
this.listenTo(this.model, 'change', _.bind(this.render, this));
},
麻煩的是,當在textarea
用戶的類型,事件的下列順序發生:
keyup
事件觸發。- 處理器在模型上調用
save
。 - 致電
save
會觸發模型的模型的change
事件。 - 該視圖,正在傾聽模型的
change
事件,請致電render
。 textarea
在DOM中被替換。textarea
不再聚焦,文本光標位置丟失。
對於這樣的情況,texarea
的keyup
事件需要觸發同步的最佳做法是什麼?我考慮過的一些選項:
- 不要綁定
change
到render
。缺點:如果模型數據由於用戶輸入以外的其他因素而改變,textarea不會自動更新。 - 閱讀並記住在
render
開頭處的光標位置。將光標位置設置在render
的末尾。缺點:取決於瀏覽器支持不明確的光標操作功能。 - 在
keyup
處理程序中,在視圖上設置一個臨時屬性,告訴它不要重新渲染。模型保存後取消設置。缺點:感覺像意大利麪代碼,與Backbone結構發生衝突。
我沒有看到任何選項嗎?你推薦以上選項之一嗎?
編輯:
我不想從主點分散,但因爲它的答案中的一個上來:我沒有直接綁定到keyup
,但_.debounce
中介吧。因此,事件處理程序僅在用戶停止輸入時才運行,如自上次keyup
以來經過一定時間所定義的那樣。
關於保存關鍵幀:我編輯了我的問題來澄清這一點。我已經在使用去抖動,所以顯然我同意你的建議。至於你答案的主要內容,我被你的推理說服了。我現在有信心,我不會反對Backbone的工作方式。謝謝! – rlkw1024 2015-03-14 13:28:59
很高興聽到它。我已經用更多的信息更新了答案。 – garethdn 2015-03-14 17:19:09