- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个基本的调查应用程序来学习 Marionette/很好地掌握嵌套模型(答案 > 问题 > 调查)。我正在使用 backbone-relational 来完成这个。
在调查 View 中,我使用复合 View 来听取每个问题。每个问题也是一个复合 View ,循环遍历每个问题的答案。这一切都有效。我无法弄清楚如何访问/冒泡在答案 ItemViews 和问题 CompositeView 中发生的事件。知道我应该怎么做吗?
通常,当我只使用一个 CompositeView 时,我可以在 View 中这样说:
triggers:
"click a.delete": "delete:clicked"
然后在 Controller 中
@listenTo view, "childview:delete:clicked", ->
console.log "delete clicked"
但这种模式似乎不适用于我当前的结构。我还尝试了单击删除按钮时触发事件的路径 > 手动触发事件,但这除了正确登录到控制台外没有用。
有什么地方出错了吗?非常感谢任何帮助!
Controller :
@example.module "SurveysApp.List", (List, App, Backbone, Marionette, $, _) ->
class List.Controller extends App.Controllers.Application
initialize: ->
survey = App.request "survey:entity", 1
App.execute "when:fetched", survey, =>
@layout = @getLayoutView()
@listenTo @layout, "show", =>
@panelRegion()
@questionRegion survey
@bannerRegion survey
@show @layout
questionRegion: (survey) ->
questions = survey.get('questions')
questionView = @getQuestionView questions, survey
@listenTo questionView, "answer:delete:clicked", (child, args) ->
console.log "answer deleted!"
# model = args.model
# if confirm "Are you sure you want to delete #{model.get("title")}?" then model.destroy() else false
@listenTo questionView, "childview:question:delete:clicked", (child, args) ->
console.log "question deleted!"
# model = args.model
# if confirm "Are you sure you want to delete #{model.get("title")}?" then model.destroy() else false
@show questionView, region: @layout.questionRegion
panelRegion: ->
panelView = @getPanelView()
@show panelView, region: @layout.panelRegion
bannerRegion: (survey) ->
bannerView = @getBannerView survey
@show bannerView, region: @layout.bannerRegion
getLayoutView: ->
new List.Layout
getBannerView: (survey) ->
new List.Banner
model: survey
getPanelView: ->
new List.Panel
getQuestionView: (questions, survey) ->
new List.Questions
collection: questions
model: survey
查看:
@example.module "SurveysApp.List", (List, App, Backbone, Marionette, $, _) ->
class List.Layout extends App.Views.Layout
template: "surveys/list/list_layout"
regions:
questionRegion: "#question-region"
newRegion: "#new-region"
panelRegion: "#panel-region"
bannerRegion: "#banner-region"
class List.Answer extends App.Views.ItemView
template: "surveys/list/_answer"
className: "answer-container"
events:
"click a.delete-button": "deleteAnswer"
deleteAnswer: (e) ->
e.preventDefault()
@trigger "answer:delete:clicked", @model
console.log "deleteAnswer"
class List.Question extends App.Views.CompositeView
template: "surveys/list/_question"
id: "1000"
className: "step"
initialize: ->
@collection = @model.get("answers")
itemView: List.Answer
itemViewContainer: ".answer-container"
triggers:
"click .delete-question-button": "quesiton:delete:clicked"
class List.Questions extends App.Views.CompositeView
template: "surveys/list/_questions"
className: "questions"
itemViewContainer: ".editor"
itemView: List.Question
class List.Banner extends App.Views.ItemView
template: "surveys/list/_banner"
id: "survey-builder"
className: "my-fluid-container"
class List.Panel extends App.Views.ItemView
template: "surveys/list/_panel"
id: "add-question"
编辑:添加 HTML
布局 View :
<div id="banner-region"></div>
<div class="container">
<div id="question-region"></div>
<div id="panel-region"></div>
<div id="new-region"></div>
</div>
横幅 View :
<div class="container">
<a id="back" href="#">
<i class="fa fa-chevron-left"></i></span>
</a>
<div class="message"><%= @title %></div>
<div class="btn btn-inline pull-right checkout">Checkout</div>
<div class="btn btn-inline pull-right">Preview</div>
<div class="btn btn-inline pull-right">Save and Close</div>
</div>
问题 CompositeView:
<div class="editor ui-sortable">
</div>
问题 CompositeView:
<div class="row">
<div class="col-sm-offset-1 col-sm-1">
<div class="step-number">1</div>
</div>
<div class="col-sm-8">
<div class="question-editor" id="editor-1000" data-question-id="1000">
<div class="question-heading">
<div id="type" class="type">
<div class="btn-group">
<button type="button" id="question-select" class="btn dropdown-toggle" data-toggle="dropdown">
<% if @single_response: %>
Single Select
<% else: %>
Multiple Select
<% end %>
<span class="caret"></span></button>
<ul class="dropdown-menu" role="menu">
<li>
<a href="#" class="single-select">Single Select</a>
</li>
<li>
<a href="#" class="multi-select">Multiple Select</a>
</li>
</ul>
</div>
<div class="btn-group">
<button type="button" id="question-select"><i class="fa fa-cog"></i>
</div>
</div>
<div class="controls">
<div class="btn delete-question-button">
<i class="fa fa-times"></i>
</div>
</div>
</div>
<div class="question-title">
<input id="question-title" type="text" placeholder="Question text" value="<%= @title %>">
</div>
<div class="answers shadowed-scrollbox">
<div class="answer-container"></div>
<div class="btn add-answer">
<i class="fa fa-plus-square"> Add Answer</i>
</div>
</div>
<div class="answer-options">
<input type="checkbox" id="randomize-1000" class="randomize-answers">
<label for="randomize-1000">Randomize answer order
<br>
</div>
</div>
</div>
</div>
答案 View :
<div class="row">
<div class="col-sm-9">
<input id="answer-title" type="text" placeholder="Answer text" class="answer" value="<%= @title %>">
</div>
<div class="col-sm-3">
<div id="answer-buttons" class="btn-group">
<a class="btn manage-skip"><i class="fa fa-code-fork"></i></a>
<a class="btn btn-danger delete-button"><i class="fa fa-times"></i></a>
</div>
</div>
</div>
面板 View :
<i class="fa fa-plus-square"> Add Question</i>
编辑
我还注意到我可以将删除逻辑直接放在 View 中,这样我就可以真正删除答案。但是,通过冒泡事件,这个逻辑似乎确实属于 Controller 。
class List.Answer extends App.Views.ItemView
template: "surveys/list/_answer"
className: "answer-container"
events:
"click a.delete-button": "deleteAnswer"
deleteAnswer: (e) ->
e.preventDefault()
if confirm "Are you sure you want to delete #{@model.get("title")}?" then @model.destroy() else false
@trigger "answer:delete:clicked", @model
console.log "deleteAnswer"
最佳答案
我想通了。您必须在嵌套组合的 View 初始化方法中监听 subview 事件,然后将其冒泡到 Controller 。
所以我可以触发然后事件 > 然后再次重新触发它直到 Controller :
class List.Answer extends App.Views.ItemView
template: "surveys/list/_answer"
className: "answer-container"
triggers:
"click a.delete-button": "answer:delete:clicked"
class List.Question extends App.Views.CompositeView
template: "surveys/list/_question"
id: "1000"
className: "step"
initialize: ->
@collection = @model.get("answers")
@model.set(question_number: @model.collection.indexOf(@model) + 1)
@on "childview:answer:delete:clicked", (child, args) =>
args.collection = @model.get('answers')
@trigger "answer:delete:clicked", args
倾听并采取行动:
questionRegion: (survey) ->
questions = survey.get('questions')
questionView = @getQuestionView questions, survey
@listenTo questionView, "childview:answer:delete:clicked", (child, args, answers) ->
model = args.model
answers = args.collection
answers.remove(model)
model.destroy()
关于javascript - Marionette 在 CompositeView 事件触发/冒泡中嵌套 CompositeView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25109687/
我真的不明白它们是如何有用的。原文article引入了初始化程序,这是代码示例: App = new Backbone.Marionette.Application(); App.addInitial
我正在准备使用 Backbone Marionette 迁移我的应用程序,但路由中出现错误: window.App = new Backbone.Marionette.Application
我正在尝试将 marionette.js 用于我的 Backbone 应用程序,但我对如何组织布局/区域并呈现它们感到有些困惑。 我正在寻找具有嵌套布局和区域的示例应用程序,以便我能更好地理解它。有什
我有一个带有区域的布局。当 Layout 初始化时,我希望它自动初始化一个预设 View 以进入它的区域,并在 Layout 本身显示/关闭时显示/关闭它。 当前示例来自 https://github
//当我点击 kickassessor 按钮时,它会更新数据库,但 View 不会更新。这是我的代码。 返回 Marionette.ItemView.extend( { initialize
我有需要显示/编辑的数据,这些数据似乎与 Marionette 提供的内置 View 不自然。让我举个例子来说明。 假设我想列出/编辑书籍。每本书都有一个 ISBN、一个书名和 0 个或多个标签。基本
我一直在查看各种 Marionette 问题,但没有找到我想要的,希望有人能给我一些合理的建议和一些建议。我是新手,只是想在我在 github 上选择的样板启动包上构建 https://github.
随着我的应用程序的增长,我觉得需要更结构化的路由器/ Controller 设置。 Marionette 文档提到以下内容: It is recommended that you divide you
在我的应用程序中,我添加了 Marionette.sync 插件并覆盖这些方法: Backbone.Marionette.TemplateCache.prototype.loadTemplate =
我想知道是否有可能以某种方式扩展 Marionette Layout 机制基于创建一种类似导航的堆栈。 Marionette 行为。 在区域 show() 的 View 之前,它会在当前显示的 Vie
看起来 Backbone.Marionette View 为事件等操作 DOM,所以我猜这不像更改基类引用那样微不足道,例如Backbone.View 到 BaseView。 有没有人解决过这个问题?
我正在使用 Marionette Layout .show渲染 CollectionView并想知道是否有办法检测 全部 ItemView children 已经完成了渲染? 我的代码的简化版本是:
因此,我不确定我是否完全理解应该如何触发此回调。如果您采用准系统模型、集合和 View : PatchModel = Backbone.Model.extend({}); PatchCollectio
我正在查看 Backbone Marionette,它似乎对我当前的项目很有前途。但是,无论 startWithParent 设置如何,添加模块时它们似乎都会自动启动。这是我遇到问题的一段代码(其中一
我是 Marionette 的新手,无法理解事件... 我有一个触发事件的 ItemView,我想在应用程序级别接收此事件,但是当我的应用程序监听此事件时,没有任何 react ... 如果事件聚合器
我有一个 CollectionView class MyCollectionView extends Backbone.Marionette.CollectionView itemView: My
我有一个复合 View ,在将模型添加到 View 集合时抛出以下错误:Uncaught ItemViewContainerMissingError: Missing itemViewContaine
我已经建立了一个项目,在其中扩展了包含两个不同区域的 Backbone.Marionette.Layout。该布局可以用作整个应用程序的组件。特别是,区域设置如下。 regions : { m
基本上,我试图将 CompositeView 呈现为一个简单的四列列表,其中包含一个表头,其中集合中的每个模型都呈现为一个并附加到 .我正在关注 an example of Derick's非常接近,
我正在尝试包含应用程序实例以使用其事件聚合器,如图所示 here 当我将实例包含在 View 中时,出现错误。 在 Requirejs 配置文件中启动 App.Bootloader.js: requi
我是一名优秀的程序员,十分优秀!