【问题标题】:Binding event to function Coffeescript. Backbone.js绑定事件到函数 Coffeescript。骨干网.js
【发布时间】:2013-09-24 06:38:22
【问题描述】:

我正在尝试获取有关 OnChange 事件的 JSON。并对现有的haml页面进行更改。 我的目标是用 json 值填充另一个选择字段。目前我只是想打印一条消息,说明 json 已获取。但我的 html 没有任何变化。

在控制台的网络选项卡中,我看到正在发出 URL 请求,并返回 304 响应。我还可以在响应中看到 json。

events:
    "submit form" : "onSubmit"
    "change [name=repository]" : "onChange"

  onChange: (e) ->
    e.preventDefault()
    name = @$("[name=repository]").val()
    localStorage['new_issue_last_repo'] = name
    token = localStorage['oauth2_github']['accessToken']
    @model = new Assignees(name)
    console.log 'Printttttt'
    @model.fetch {headers : @token},
      success: (model) =>
        @$('.assignee').html("<span>Fetched assignees</span>")
      error: =>
        @$('.assignee').html("<span>Failed to fetch assignees :(</span>")

haml 文件如下所示。

.message
.assignee
%form
  %section.repo-select
    %select{name: 'repository'}
      - for repository in @repositories.models
        - full_name = repository.get('full_name')
        - if localStorage['new_issue_last_repo'] == repository.get('full_name')
          %option{value: full_name, selected: 'selected'}= repository.get('full_name')
        - else
          %option{value: full_name}= repository.get('full_name')

获取 json 后如何让 .assignee 更改。还有如何访问json数据?

我有一个类似的功能。我不知道我在 onChange 函数中做错了什么。

  onSubmit: (e) ->
    e.preventDefault()
    name = @$("[name=repository]").val()
    localStorage['new_issue_last_repo'] = name
    repository = @repositories.find (r) -> r.get('full_name') == name
    model = new IssueModel({
      body: @$("[name=body]").val()
      title: @$("[name=title]").val()
      assignee: @$("[name=assignee]").val()
      milestone: @$("[name=milestone]").val()
    }, {repository: repository})

    model.save {},
      success: (model) =>
        @badge = new Badge()
        @badge.addIssues(1)
        @$('.message').html("<span>Issue <a href=\"#{model.get("html_url")}\" target=\"_blank\">##{model.get('number')}</a> was created!</span>")
      error: =>
        @$('.message').html("<span>Failed to create issue :(</span>")

【问题讨论】:

  • @muistooshort 更新了问题。抱歉这个含糊的问题,我还在想办法弄明白coffeescript。

标签: backbone.js coffeescript haml


【解决方案1】:

我对 HAML 不是很了解,但是这个:

%form
  %section.repo-select
    %select{name: 'repository'}

应该变成这样的 HTML:

<form>
    <section class="repo-select">
        <select name="repository">
            <!-- ... -->
        </select>
    </section>
</form>

对吗?这意味着没有任何东西可以匹配 ID 选择器 #repo-select,因此绑定到这些事件的处理程序 onChange 将永远不会被调用。

如果您想从 &lt;select&gt; 获取更改事件,那么您需要在您的 events 中添加类似的内容:

'change [name=repository]'

详见Backbone's View#delegateEventsjQuery's Selectors文档。

就您的消息而言,我认为您对 Model#save 参数之间的区别有点困惑:

保存 model.save([attributes], [options])

Model#fetch 参数:

获取 model.save([options])

save 在第二个回调中接受两个参数,所以这是可行的:

model.save {},
  success: (model) => ...
  error: => ...

但是fetch 只接受一个参数,回调应该在那个参数中,所以这样:

@model.fetch {headers : @token},
  success: (model) => ...
  error: => ...

无法工作,因为 fetch 甚至看不到 successerror 回调。你会想说:

@model.fetch
  headers: @token
  success: (model) => ...
  error: => ...

获取fetch的所有三个参数。

【讨论】:

  • 这样做了,我实际上使用的是“更改选择”,它一直有效,因为我只有一个选择元素。谢谢(你的)信息。 onChange 函数正在执行,当我选择某些内容时,我可以看到对 api 的 fetch 调用,但现在仍然显示消息。
  • 什么信息?你为什么希望它被展示出来?显示在哪里?
  • 关于成功和错误的 fetch 调用,我试图在网页顶部显示一条消息。 (在 .assignee 类中) onSubmit 下面的类似函数对 .message 类执行相同的操作,并且可以正常工作。知道我哪里出错了吗?
  • 看看我的更新,你用错误的参数调用fetch
  • 你能发布你想要实现的工作代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
相关资源
最近更新 更多