2013-07-16 46 views
0

我已经得到了我的工作文件的copule,我试图创建这种方法我有我的观点骨干骨干听众似乎没有被解雇

APPVIEW的监听器。 js.coffee

namespace "happiness_kpi", (exports) -> 
    exports.appView = Backbone.View.extend 

    events: 
     "click #happy" : "selection" 

    selection: -> 
     console.log "selection was called" 

index.html.haml

%input{ :type => "image", :src => "/assets/smiley.jpg", :alt => "happy", :id => "happy" } 
%input{ :type => "image", :src => "/assets/undecided.jpg", :alt => "undecided", :id => "undecided" } 
%input{ :type => "image", :src => "/assets/sad.jpg", :alt => "sad", :id => "sad" } 

,这里是我的规格:
app_view_spec.js.coffee

it "is called when one of the faces is clicked", -> 
    $("body").append('<input alt="happy" id="happy" src="/assets/smiley.jpg" type="image">') 
    $("body").append('<input alt="undecided" id="undecided" src="/assets/undecided.jpg" type="image">') 
    $("body").append('<input alt="sad" id="sad" src="/assets/sad.jpg" type="image">') 
    @subject.selection = sinon.spy() 

    $("#happy").click 

    sinon.assert.calledOnce(@subject.selection) 

我收到错误'错误:预计的间谍被调用一次,但被称为0次'任何人有任何想法,为什么事件没有被触发时,输入被点击?

在此先感谢。

+0

'点击()'用括号可能触发事件? – Tallmaris

回答

0

这么多的研究和他的动手后,我似乎已经走到了一个答案。问题绝对是我将图像附加到iframe的方式。问题在于测试似乎在iframe之外创建了一个新元素,并且对该页面不可见。该$('#happy').click()正在执行正确,但是,它的东西,并没有在iframe存在执行。

所以我的解决办法:

app_view_spec.js.coffee

beforeEach -> 
    $("body").append('<div id="display"></div>') 

afterEach -> 
    $("body").append('<div id ="display"></div>').remove() 

it "is called when one of the faces is clicked", -> 
    @subject.emotionSelection = sinon.spy() 
    @subject.delegateEvents() 

    $("input#happy").click() 

    sinon.assert.calledOnce @subject.emotionSelection 

appView.js.coffee EL: '#display'

initialize: -> 
    @render() 

events: -> 
    'click #happy': @emotionSelection 

render: -> 
    @$el.html HandlebarsTemplates.faces() 

emotionSelection: -> 
    console.log "hello" 

我发现做这方式是一个更好的途径,我只是附加我HAML到的iframe,而不是试图在自己的每个图像追加。学过的知识。谢谢您的帮助!

1

如果在调用click()时问题不是明显的括号中的拼写错误,那么我在想的另一件事是Backbone中的事件被限制在View元素中。这意味着,一个视图不能列出事件本身外发生的事情(这当然可以,但不能简单地使用events对象)。

试着在你测试开始这样做:

@subject.setElement($("body")); 

这将设置查看el$el body标签,所以要附加您查看里面实际上将图像和事件将被触发。

+0

我尝试设置'@ subject.setElement($( “身体”));'但是我得到的错误'el'和'$ el'是不确定的。我试图在控制台上摆弄它,但我没有太多的运气。我发现问题的一部分与我的模板有关,但我已经解决了这个问题,并回到了手头的问题。 – ndland