オートコンプリートを処理するためのカスタムバインディングがあります。ユーザーがオートコンプリートから項目を選択すると、サーバーと通信してtext_fieldを短縮名に置き換えます。問題は、これが私のカスタムバインディングの '更新'機能をもう一度起動させることです。Knockout.js - カスタムバインディングを調整する方法
Knockout.jsコード(編集:次の点に注意してくださいは、CoffeeScriptのです):
ko.bindingHandlers.ko_autocomplete =
init: (element, params) ->
$(element).autocomplete(params())
update: (element, valueAccessor, allBindingsAccessor, viewModel) ->
unless task.name() == undefined
$.ajax "/tasks/name",
data: "name=" + task.name(),
success: (data,textStatus, jqXHR) ->
task.name(data.short_name)
Task = ->
@name = ko.observable()
@name_select = (event, ui) ->
task.name(ui.item.name)
false
task = Task.new()
ビュー
= f.text_field :name, "data-bind" => "value: name, ko_autocomplete: { source: '/autocomplete/tasks', select: name_select }"
カスタムバインディングにスロットルを適用する方法はありますか?
カスタムバインディングの「更新」機能が、サーバーから返されたshort_nameにtask.nameを設定したときに2回目のトリガーを停止したいだけです。
disposeWhenNodeIsRemovedオプションを追加して新しい計算バインドを正しく処理できるようにすることが重要です。そうしないとメモリリークが発生し、パフォーマンスが低下するか悪化します。 –