2013-02-17 99 views
1

已经能够获得事件在我的木偶控制器火,像这样:Backbone.js的木偶ItemView控件单击事件不工作

...snip... 
var Controller = {}; 

_.extend(Controller, Backbone.Events); 

// private 
var Layout = Marionette.Layout.extend({ 
    template: _.template(layout), 

    regions: { 
     inspectorStart: "#inspector_start", 
     loginStart:  "#login_start", 
     playerStart: "#player_start" 
    } 


}); 

// private 
var _initializeLayout = function() { 
    console.log('initialize Start Layout...'); 
    Controller.layout = new Layout(); 
    Controller.layout.on('show', function() {  **// This works** 
     Controller.trigger('startLayout:rendered'); **// This works** 
    }); 
    vent.trigger('app:show', Controller.layout); **// This works** 

}; 


// Listen for events /////////////////////////////////////////// 
// controller attach a sub view 
Controller.on("startLayout:rendered", function() { **// This works** 
    console.log('startLayout:rendered =>StartController'); **// This works** 
    // render views for the existing HTML in the template,... 
    var inspectorStartView = new InspectorStartView(); 
    // and attach it to the layout (i.e. don't double render) 
    Controller.layout.inspectorStart.attachView(inspectorStartView); 
    Controller.trigger('inspectorStart:show', inspectorStartView); **// This works** 
...snip... 

然而,当我尝试使用扩展木偶ItemView控件我可以不会让事件或触发器起作用。

// views/InspectorStartView.js 
// ------- 
define(["jquery", "marionette", "text!templates/InspectorStart.html"], 

function($, marionette, template){ 

    var InspectorStartView = marionette.ItemView.extend({ 
     template: template, 

     events: { 
      'click .starting_thumbnail' : 'start' 
      //'click #inspectorStart' : 'start' **// didn't work either** 
     }, 
     //I had also tried triggers 
     triggers: { 
      //'click .starting_thumbnail' : 'inspectorStart:start' 
      'click #inspectorStart' : 'inspectorStart:start' **// didn't work either** 
     }, 


     start:function(){ **// Doesn't get called** 
      console("Caught InspectorStartView click") 
      this.trigger("inspectorStart:start") 
     } 

    }); 

    // Returns the View class 
    return InspectorStartView; 
}); 

这里是模板:

<!-- InspectorStart.html --> 
<div id="inspectorStart" class="thumbnail starting_thumbnail"> 
<img src="/img/detective-97715888.jpg" alt="Inspector" width="200px" height="300px"> 
<div class="caption"> 
    <h3>Inspectors Enter Here</h3> 
    <p>Den Masters, Teachers, Parents, House Mothers, this is where you start.</p> 
</div> 
</div> 

我也必须创建starting_thumbnail类,这样我会得到一个指针:

.starting_thumbnail{ 
cursor: pointer; 
} 

我需要做别的事情让div可点击?

在我第一次尝试我App.vent通过,并试图用它来无济于事我现在扩展控制器{}与_.extend(控制器,Backbone.Events);

在从@Ingro一些调试建议我登录的ItemView控件这是什么。$埃尔ID。这个: console.log([“InspectorStartView initalise”,this。$ el])

这里是输出。有nodeName:“DIV”和localName是div。

["InspectorStartView initalise ", jQuery.fn.jQuery.init[1]] 
0: "InspectorStartView initalise " 
1: jQuery.fn.jQuery.init[1] 
0: div 
accessKey: "" 
align: "" 
attributes: NamedNodeMap 
baseURI: "http://localhost:8001/index.html" 
childElementCount: 1 
childNodes: NodeList[3] 
children: HTMLCollection[1] 
classList: DOMTokenList 
className: "" 
clientHeight: 496 
clientLeft: 0 
clientTop: 0 
clientWidth: 300 
contentEditable: "inherit" 
dataset: DOMStringMap 
dir: "" 
draggable: false 
firstChild: #comment 
firstElementChild: div#inspectorStart.thumbnail starting_thumbnail 
hidden: false 
id: "" 
innerHTML: "<!-- InspectorStart.html -->↵<div id="inspectorStart" class="thumbnail starting_thumbnail">↵ <img src="/img/detective-97715888.jpg" alt="Inspector" width="200px" height="300px">↵ <div class="caption">↵  <h3>Inspectors Enter Here</h3>↵  <p>Den Masters, Teachers, Parents, House Mothers, this is where you start.</p>↵ </div>↵</div>" 
innerText: "↵Inspectors Enter Here↵Den Masters, Teachers, Parents, House Mothers, this is where you start.↵↵" 
isContentEditable: false 
lang: "" 
lastChild: div#inspectorStart.thumbnail starting_thumbnail 
lastElementChild: div#inspectorStart.thumbnail starting_thumbnail 
localName: "div" 
namespaceURI: "http://www.w3.org/1999/xhtml" 
nextElementSibling: null 
nextSibling: null 
nodeName: "DIV" 
nodeType: 1 
nodeValue: null 
offsetHeight: 496 
offsetLeft: 621 
offsetParent: body 
offsetTop: 388 
offsetWidth: 300 

<!-- all the on<eventname> were null --> 

outerHTML: "<div><!-- InspectorStart.html -->↵<div id="inspectorStart" class="thumbnail starting_thumbnail">...snip..." 
ownerDocument: #document 
parentElement: li#inspector_start.span4 
parentNode: li#inspector_start.span4 
prefix: null 
previousElementSibling: null 
previousSibling: null 
scrollHeight: 496 
scrollLeft: 0 
scrollTop: 0 
scrollWidth: 300 
spellcheck: true 
style: CSSStyleDeclaration 
tabIndex: -1 
tagName: "DIV" 

当然上面是在初始化方法里面。我想看看创造一个“新”一前一后的区别:

/ controller show inspector in the layout/subview 
Controller.on('inspectorStart:show', function(inspectorStartView) { 
    console.log('show inspector start view'); 
    console.log(**'InspectorVartView instance this.$el : ', inspectorStartView.el**); 
    Controller.layout.inspectorStart.show(inspectorStartView); 
}); 

输出小得多:

InspectorVartView instance this.$el : 
<div>​ 
    <!-- InspectorStart.html --> 
    <div id=​"inspectorStart" class=​"thumbnail starting_thumbnail">​…​</div>​ 
</div>​ 

@Ingro被包裹在一个div为什么会是怎么回事?

有没有人看到我在做什么不正确?

感谢,

安德鲁jsFiddle(见下文评论)

+0

div #inspectorstart是您视图的父元素,您的$ el?在这种情况下,你应该在你的活动中试试这个:''click':'start'' – Ingro 2013-02-18 00:19:09

+0

@Ingro谢谢你的建议。我尝试'点击':'开始'它不起作用。我把名字从'start'改为'fire',看看名字是否有所不同。它没有什么区别。它似乎应该是直截了当的,但由于某种原因,它不是, – KingAndrew 2013-02-18 08:24:42

+0

这是一个jsFiddle(http://jsfiddle.net/KingAndrew/SeDeL/)的开头。我不确定如何添加骨干和牵线木偶,但这是一个开始。 – KingAndrew 2013-02-18 08:51:26

回答

0

原来我在某种程度上破坏的jQuery。我用jsfiddle来证明我的代码是正确的。然后我开始考虑版本号要求,并替换jquery,并开始工作。

感谢@Ingro的输入。

Andrew