- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是Backbone.js的新手,在为模型视图关系确定正确的体系结构时遇到了麻烦。
我有一个视图,其中包含一个输入框和一个模型,该模型应采用该输入框的内容并将其发送到服务器。
我的问题是,我并不总是有一个谨慎的DOM事件,该事件会触发视图更新模型数据的请求,例如input.change
。有时代码本身需要询问模型以将更新发送到服务器。
到目前为止,我已经想到了针对此问题的三种解决方案,但是我不确定它们是否有用:
在输入元素的keypress
事件上更新模型
用模型初始化视图后,使视图更新/添加到名为“ get_input_value()
”的模型的函数,该函数返回输入框的值
每当应用程序需要请求模型更新服务器时,首先在视图中调用一个函数,该函数会将用户在视图中键入的所有信息更新为模型。
请记住,这是一个简化的示例。该视图还包含子视图,所有子视图都包含用户可以操纵的许多元素,需要使用所有这些信息来更新模型,以便可以更新服务器。
任何帮助和输入表示赞赏!非常感谢!
编辑:::
基于machineghost的响应,我现在看到我没有正确阐明此问题:
有一个DOM事件,但问题是它不一定源自使用模型的视图内部。它可能源自路由器或其他视图,并由全局事件处理程序触发。此外,没有1:1的视图模型关系。多个以不同方式表示模型的视图使用该模型。因此,在这种情况下,似乎更新服务器的命令不应通过View,而应通过模型本身。在这种情况下,模型必须能够说“将我的意见与我同步!”。
但是我不知道如何在不违反规则的情况下做到这一点,从而在架构上造成其他问题。
最佳答案
好的,这是一个主观的问题,所以请原谅我,好像我在吐出我的两分钱一样。在我什至没有回答你的问题之前,我不得不承认我对你有点怀疑:
不一定总是有谨慎的DOM事件
因为用户可以执行的几乎所有操作都会触发您可以观看的事件。例如,如果您要等到用户更改文本输入后,就会出现change
,而且(如您所指出的)还有各种key*
事件,再加上blur
(通常用于此类操作) 。在3(+)之间,您应该始终能够适当响应用户的操作。只有在(例如)您必须每3秒保存一次文本输入的内容时,它才真正独立于DOM事件。
因此,在不知道您的详细信息的情况下,我仅需指出那里有些腥味。但是无论如何,关于您的实际问题,以下是我对您的想法的看法:
在输入元素的按键事件上更新模型
当然可以,但是只要确保使用视图进行实际的事件处理/模型设置即可;在模型中挂接onKeyPress处理程序将是一个坏主意
总的来说,这种方法看起来很标准,并且符合骨干范式。
用模型初始化视图后,让视图更新/向模型添加一个名为“ get_input_value()”的函数,该函数返回输入框的值
我不太了解这如何解决您的问题,而且似乎将问题放在了错误的位置:模型(理想情况下)应该与DOM无关。
每当应用程序需要请求模型更新服务器时,首先在视图中调用一个函数,该函数会将用户在视图中键入的所有信息更新为模型。
是每5分钟进行一次保存吗?如果不是,则可能是响应用户的操作而发生的,您应该使用事件处理程序来响应。
但是,如果确实需要使同步独立于用户操作,则建议使用自定义事件来管理事务。换句话说,在模型的sync方法中输入this.trigger('preSync')
之类的内容。然后,每个使用该模型的视图都可以绑定某种updateMyModelValue
方法,即。 this.model.on('preSync', this.updateMyModelValue, this);
。
这样,您的模型代码根本就不会直接与DOM交互。相反,它只是担心应该担心的东西(数据),而视图在需要从DOM更新数据时会注意。
希望能有所帮助。
*编辑(响应您对问题的编辑)*
在这种情况下,模型必须能够说“将我的意见与我同步!”。
模型说的一般Backbone方式...好吧,它的观点几乎都是通过事件实现的。
(从技术上讲,您可以在模型本身中维护模型视图的列表,然后遍历该列表以告知视图执行操作。Backbone甚至没有经过优化,可以让您做到这一点。但是,从可维护性的角度来看,对我来说似乎是一种可怕的方法。)
我的“预同步”事件示例(如上)演示了如何使用此技术。如果不清楚,请回击。
同样,如果您遇到以下问题:
查看A捕获事件
视图B需要对此事件做出响应
您基本上有两个选择:
1)您可以将两个视图紧密结合。假设有一个表视图创建了行视图,但是需要响应那些行中发生的事件。创建表时,您可以将表本身作为选项传递给该行(new Row({table:this})
),然后当这些行需要告诉其表“发生了事件”时,它们可以执行this.options.table.informThatAnEventHappened()
。如果两个视图本质上是相关的,例如表及其行,则这是一种很好的方法。如果没有,更好的方法是:
2)您可以使用事件在视图之间进行通信。假设您在页面顶部有一个标题div,每当“标题”文本输入发生更改时,都需要对其进行更新...但是该文本输入在页面的下方,与概念上的关系不大页面标题(除了设置页面标题)。这两个元素(及其视图)之间的共同点是数据,即标题本身的文本。
现在想象一下titleDivView和titleSettingInputView都共享一个pageTitle模型。当titleSettingInputView调用this.model.set('titleText', 'newTitle')
时,titleDivView可以侦听this.model.on('change:titleText', ...)
,并相应地重新呈现自身。这样,两个完全未连接的,解耦的视图可以彼此交互,而无需创建相互关联的代码的纠结网络。
当然,如果没有一个方便的“ change:title
”事件绑定到您,则可以像上面我描述的自定义“ presync”事件一样,随时创建自己的事件。
关于javascript - 如何在没有DOM事件的情况下从 View 获取信息到Backbone.js中的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11571166/
我有一个主 View 负责呈现其他 View ...... 这是完整的代码 (1) (2) (3)。 当我第一次加载 View (View1、View2、View3)时,一切正常。 然后,如果我尝试重
我正在第一次尝试使用 Backbone.Marionette,并想知道当一个简单的 Backbone.View 就足够了时,是否有任何理由使用 Backbone.Marionette.ItemView
我正在尝试将 Backbone Validation 与 Backbone Stickit 结合使用,我希望在用户输入时一次验证一个属性。但是,当用户输入一个值时,模型上的所有属性都会得到验证,而不仅
我在结合使用 T. Hedersen 的 backbone.validation 插件 ( https://github.com/thedersen/backbone.validation ) 和 D
在下面编辑了这个 在下图中,我有两个主要区域。 左边的用户列表:allusersRegion 另一个用于显示布局的右侧,其中包含在 allusersRegion 中单击的用户的唯一属性和用户的文章列表
如果您单击链接,我的主干路由器工作正常,但在尝试直接访问 URL 或刷新页面时不起作用。 路由器 var app = app || {}; var appRouter = Backbone.Route
我想创建一个 Backbone 模型并将另一个模型的集合存储到它的属性中。所以,有父子模型。每个父级都有一个或多个子级存储在其属性中的数组中。 JSON 将是这样的。 Parent = { n
我正在使用 Backbone 和木偶, 我想对我的收藏和渲染 View 进行排序。 但是发生了一些奇怪的事情。 '/api/note/getList' ,它返回(并在集合被 View 初始化时调用)
我有一个相当通用的模型,并且正在收集该模型(请参见下文),作为一系列观点的基础。在几种 View 上,选择一个模型会生成操作(通过“selected”属性),我需要能够仅在客户端跟踪选择。 但是,似乎
这是一个单一的问题,但我对这是否是一个好习惯这一事实深有感触。 基本上,假设我们有这个微不足道的场景: (function(){ window.App = { Models: {},
我正在使用 Signalr 集线器订阅服务器上的事件。将什么事件分派(dispatch)到集线器,它成功地将项目添加到 Marionette CollectionView。反过来,这会呈现到表格中。
我正在使用 require js 和 Backbone 为 android 开发应用程序。我必须通过 touchend 事件将从集合中获取的模型传递给路由器。我该怎么做? define(["jquer
我有一个 Backbone 集合。如何对集合进行切片,或者至少将列表截断为特定长度? 最佳答案 假设您已经定义并初始化了您的集合,并且您想要改变集合(就地更改),您必须执行以下操作: collecti
我有一个集合,其中有一个添加模型时会触发的事件。我已经在文档中阅读了应该具有options参数但无法获取的参数。 我基本上想在集合中找到模型所在的索引。 在我的收藏夹中,我有这个。 initi
从集合中删除模型时,如何获取模型的索引。 在下面的代码中有一个回调函数 doSomething(){} ,它在 remove 被触发时被调用,我希望索引在那里。 Backbone 文档说“移除前模型的
在项目中同时使用Polymer和Backbone是否有任何限制? 我想不出什么具体的东西,但我想我会在匆忙之前先问清楚。有人可能已经同他们一起工作过,并且发现了某种不兼容之处。 欢迎任何反馈和经验分享
我正在使用bone.js编写应用程序,并在页面之间进行动画处理(有点像iPhone风格的ui)。因此,当您单击按钮时,下一页将从右侧滑入,而单击后退按钮将使下一页从左侧滑入。我希望能够使用路由器对浏览
我刚刚开始学习ribs.js。我在理解如何/何时使用模型和集合时遇到问题。我在网上找到了几个教程,每个教程都使用不同的方法来构建应用程序。在某些情况下,是从Collection对象的REST API中
我有一个由 REST API 给出的模型,其中一个名称的属性是这样的: defaults: { ... "user-name" : "", ... } 然后当我尝试通过这种方式在模板中呈现它时: U
我有一个 Backbone 应用程序,它从我使用 Backbone 的代码中的不同位置不确定地获取错误 Backbone is not defined 。有时它会先加载然后加载网站,有时则不会。我将以
我是一名优秀的程序员,十分优秀!