Polymer 应用最佳实践
Polymer app best practices
我在开发 Polymer Web App 时遇到了一些最佳实践问题。
假设我有一个 Todo 应用程序。主要元素 my-main-task
负责在这些元素之间切换:list
所有任务,view
单个任务,创建 new
任务,edit
任务和delete
一个任务。
我的问题是:new
元素必须自己使用 firebase-document
或 iron-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)应该作为一个事件来完成。这对于元素的可重用性至关重要,因为元素之间的耦合要低得多。
我在开发 Polymer Web App 时遇到了一些最佳实践问题。
假设我有一个 Todo 应用程序。主要元素 my-main-task
负责在这些元素之间切换:list
所有任务,view
单个任务,创建 new
任务,edit
任务和delete
一个任务。
我的问题是:new
元素必须自己使用 firebase-document
或 iron-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)应该作为一个事件来完成。这对于元素的可重用性至关重要,因为元素之间的耦合要低得多。