Polymer 应用最佳实践

Polymer app best practices

我在开发 Polymer Web App 时遇到了一些最佳实践问题。

假设我有一个 Todo 应用程序。主要元素 my-main-task 负责在这些元素之间切换:list 所有任务,view 单个任务,创建 new 任务,edit 任务和delete 一个任务。

我的问题是:new 元素必须自己使用 firebase-documentiron-ajax 保存数据,或者将其委托给 my-main-task?

在最近的 Polymer 峰会(伦敦 2016)中,有很多关于 lazy(如延迟加载)的讨论。这意味着,您只 load/render 您需要的,(在最好的情况下)没有别的。

这就是说,对你的问题的简短回答是: new 元素应该自己保存数据,因为这是最合适的地方.

回答比较长,请耐心等待

Google Developer's Web Fundamentals page, there is actually an architectural pattern named The App Shell Model。此模式实际上描述了您的 my-main-task 元素。

一些有用的引语:

The app "shell" is the minimal HTML, CSS and JavaScript required to power the user interface /.../

/.../ In general, your app should load the simplest shell possible but include enough meaningful page content with the initial download.

也就是说,将保存新项目的逻辑放入应用 shell 元素(在您的例子中是 my-main-task 元素)是不明智的。

为了更进一步,让我们看一下 Polymer 的示例 Shop app (Github repo, Online demo)。

如果您查看“app shell”元素 shop-app (source code),您会发现它仅实现了以下内容:

  • 基本页面布局(边栏、内容)
  • 路由
  • 购物车数据
  • 购物车逻辑

在这种特殊情况下,购物车数据和逻辑被放入 shell 元素中,因为它用于所有页面,但除此之外 no other业务逻辑在那里实现。

关于您问题的长答案,让我们看一下结帐页面,即shop-checkout 元素(source code)。您可以看到,所有与表单相关的数据(即发布到服务器)都在此元素内完成,没有任何内容被委托给应用 shell 元素。

另一个示例是 shop-list 元素 (source code)。同样,您可以看到该元素自行检索数据,仅与 app shell 元素交互以更改部分。

最后,让我们举出另一个同样包含在上述 Shop 应用程序中的良好做法,即数据在应用程序内流动的方式。 Polymer Summit (Youtube video) 上有一个关于这个的有趣的演讲,其本质是:尽可能使用 one-way 数据绑定并尽量避免 two-way 数据绑定,除非真的有必要。为此,向下数据流(parent到child)应该作为one-way数据绑定来完成,向上数据流(child到parent)应该作为一个事件来完成。这对于元素的可重用性至关重要,因为元素之间的耦合要低得多。