【问题标题】:Backbone - dynamically apply select2 with user entered optionsBackbone - 使用用户输入的选项动态应用 select2
【发布时间】:2014-04-18 01:47:42
【问题描述】:

我正在用 CoffeeScript 编写一个 Backbone 应用程序。我也将 Select2 用于下拉菜单。一些下拉菜单支持用户输入新的下拉选项。我一般都能做到。但是……

我的问题是我想通过在我的 Backbone 视图中循环遍历模型字段来为用户创建的选项动态应用 select2。

也许代码可以解释我做得更好。 (希望)

# this is taken from the render method of my view
#
# Apply select2 widget for fields accepting user-created options
field_options = null
for field in @model.fields
    if field.fieldType == 'hidden' and field.show and field.options?
        field_options = field.options
        @$('input[name=' + field.name + ']').select2
            width: 'resolve'
            data: field_options
            createSearchChoice: (term) ->
                id: String(field_options.length + 1)
                text: term

如果只有一个字段接受用户创建的选项,则此代码有效。如果有两个字段,那么field_options.length 总是相同的长度(只有一个字段的长度)。

我知道我有一个范围界定问题,但不知道如何纠正它。

请帮忙!我卡住了

【问题讨论】:

  • 当然,我意识到我可以将id 设置为term,而不是一个递增的数字。但仍然对范围界定问题感到好奇

标签: javascript backbone.js coffeescript jquery-select2


【解决方案1】:

您的作用域问题在于您的 select2 函数持有对 field_options 变量的引用,field_options 在循环内使用,但是当循环结束时 select2 函数仍然持有对它的引用,这实际上意味着它获取 field_options 收到的最后一个分配的值。这很复杂,因为这是一个 javascript 错误。

你能做的最好的事情就是把它转换成一个函数,函数,不像{},有自己的范围。

我认为更简洁的方法是:

setSelect2 = (field) ->
  @$('input[name=' + field.name + ']').select2
    width: 'resolve'
    data: field.options
    createSearchChoice: (term) ->
      id: String(field.options.length + 1)
      text: term 

setSelect2 field for field in @model.fields when field.fieldType == 'hidden' and field.show and field.options?

这样函数捕获字段变量(因为函数有它自己的范围)并且在下一个循环中不会改变它

【讨论】:

  • 谢谢@ekeren!做到了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多