我正在用优秀的书" Backbone.Marionette.js: A Gentle Introduction"学习木偶/骨干。 在“处理数据延迟”一章中,作者(David Sulc)使用JQuery延迟对象/承诺将数据从fetch()动作(在entities / contact.js中调用)传递给控制器(show_controller.js)和示例中的list_controller.js。)
我理解它是如何工作的,但在我之前关于Backbone的读物中,这种事情是由Backbone事件处理的:我们听取了一个'更改'模型上的事件,我们在触发时调用render()。所以我对此有几个问题:
1 /当我们从服务器获得响应时,延迟对象是否比骨干事件更好地更新视图? 2/2解决方案的优点和缺点是什么? 3 /在这种情况下使用骨干事件是错误/糟糕的设计?
感谢您的帮助!
答案 0 :(得分:1)
好的,让我试试解释,
<强> 1 强> 延迟对象具有承诺,因此它包含内置的回调。因此,在数据驱动的Web应用程序中,最好使用它来摆脱异步函数的回调地狱。
<强> 2 强> 如果您需要绑定用户控件事件,那么您需要来自Backbone.Events的触发器或事件来执行此操作,在这种情况下,您必须通过控制器手动传播事件。另一方面,延迟对象可以在完成时提供状态,因此您可以填充视图或执行其他任务。
第3 强> 引入了良好的延迟机制来缓解手动回调势不可挡的情况。使用promises而不是回调更容易,这使得代码更清晰。 因为javascript是单线程承诺对于异步操作更有效。
答案 1 :(得分:1)
只有在从服务器获取模型/集合时,才需要加载/实例化视图的特定用例。在这种情况下,您可以使用Deferred对象,因为它会准确地告诉您何时加载了数据。
当然,您可以在模型/集合上侦听更改事件,但是您需要已经实例化视图,或者为模型/集合添加额外的侦听器以创建视图。
所以,回答你的问题:
1。真的取决于,如果您不介意更新您的观点,那么事件就可以了。如果您想稍后实例化视图,延迟是一个很好的选择。
2. 参见简介
3。不是。它还取决于您的应用程序的规模。正如S_I_R所提到的那样,它可能会产生更清晰的代码。
答案 2 :(得分:0)
1)当我们从服务器获得响应时,延迟对象是否比骨干事件更好,以便更新视图?
延迟对象更好。
我会解释原因。依赖视图在其模型或集合上的更改或同步事件后重新呈现可能会导致视觉异常。让我们从服务器获取集合并将其模型显示为列表时举例说明。当集合为零模型时,您希望显示“未找到模型”。在这种情况下,在获取集合并触发“更改”事件之前,用户将在屏幕上看到“未找到模型”。一旦提取了集合,视图将自动重新呈现,现在用户将看到模型。这可能会导致混淆。虽然这只是众多用例中的一个,但我相信你明白我的意思。
从服务器获取对象后,您可以将视图的render()方法绑定到对象的'change'或'sync'事件,以便对对象进行任何后续更改。
2)2种解决方案的优点和缺点是什么?
我认为问题1的答案也回答了这个问题。
3)在这种情况下使用骨干事件是错误/糟糕的设计吗?
可能。我会选择S_I_R的answer。