如何在使用coffeescript呈现视图之前允许骨干函数执行

时间:2017-11-02 19:28:54

标签: ruby-on-rails backbone.js drop-down-menu coffeescript race-condition

我有一个Rails应用程序,它使用骨干和coffeescript来使界面更好。但是,我遇到了一些问题。我怀疑问题是竞争条件。最好使用代码段进一步澄清。

以下是我的coffeescript代码片段:

class VGStream.Views.Scenarios.TypeWellScheduleForm extends VGStream.Views.Base.AjaxForm
  className: 'schedule-form'
  template: JST['backbone/templates/scenarios/type_well_schedule_form']

  initialize: (options) ->
    super
    @typeWells = options.typeWells

  render: ->
    @$el.html @template @
    @$('.well_type').val @model.get('scheduleable_type')
    @setWellSelection()
    @$('.well_id').val @model.get('scheduleable_id')
    @$('.exclude').val if @model.get 'exclude' then 1 else 0
    @calculateNetAcreage()
    @

  setWellSelection: ->
    if @$('.well_type').val() == 'TypeWell'
      wells = @typeWells.computed
    else
      wells = @typeWells.imported

    wellSelect = @$('.well_id')

    wellSelect.empty()

    for well in wells.models
      wellOption =  $ '<option>',
        value: well.get 'id'
        text:  well.get 'name'
      wellSelect.append wellOption

从函数定义中可以看到,setWellSelection函数会填充下拉选择框的选项。它有近1000个选项。我同意我不应该在下拉选项中允许尽可能多的选项,但这是我想要争取的战斗。

此代码在我的本地计算机上运行良好,因为localhost上没有网络延迟。显示下拉列表选项没有任何问题。但是,在网络上,部署在Heroku上的应用程序,在我点击下拉列表然后显示之前,下拉列表不会显示。加载后,一切正常。

我想做的是以某种方式使setWellSelection调用同步,以便在执行渲染函数的其余部分并显示模板之前,它有机会填充下拉选择框。

我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

您可以修改从模板返回的html,然后再将其渲染到屏幕上。

您可以直接修改html,因为它只是字符串。通过这种方式,您将拥有一个不错的性能解决方案,但维护起来会非常困难。

另一种方法是将html字符串转换为jquery对象并修改它,我认为这是一种更好的方法,即使它可能很慢。稍后您可以从jquery对象中获取更新的html并渲染到屏幕。