4

可重用性和抽象性正在扼杀我;我显然一直在做很多客户端开发。CoffeeScript、Backbone 和 Marionette 提供了帮助。尽管如此,构建完全可重用、模块化的“模板”——从服务器端到更高——仍然是不可能的。让我从上到下描述一个问题,然后也许你可以帮助描述最好的堆栈。

我想构建一个登录小部件,可以使用相同的框架在多个应用程序中进行版本控制和重用(这是一个基本的异想天开的例子,用一些盐来处理)。一个大型应用程序是个坏主意,无论如何它们都是单独托管的。所有单独的应用程序都使用相同的 API,托管在其他地方,并且不接受 JSONP。

客户端

登录表单将由 Marionette ItemView、一些处理所有花哨交互的 jQuery 函数、一个处理 POST、GET、DELETE 各个方面的 Backbone “Account”模型以及一些带有 View 的基本 html 组成. 通常,我必须为 AJAX 交互显式设置 urlRoot(见下文),但我只想说 '/' + @attributes.email,因为 ROUTE 是什么并不重要,因为一切都捆绑在一起。

class Account extends Backbone.Model  
  # Normal
  create: () ->
    @urlRoot = () ->
      '/account/' + @attributes.email
    @save()

  # Ideal
  create: () ->
    @urlRoot = () ->
      '/' + @attributes.email
    @save()

服务器端

这是根据客户端(希望在 Scala 中)构建的,而不是在某处显式定义 ROUTE:

POST /account/:email controllers.Account.create(password: String) # Play 2.0 syntax

我只能说:

@POST(/:email?password=[String]) # Made up syntax
create(email, password) = {
  
  # Hit external API 
  val json = WS.url('https://someapi/v1/account').withQueryParams('email=' + email + '&password=' + password).get()

  # Return some response
  Ok(json)

}

应用程序框架可能会知道这个模块或模板,@account()如果我想构建一个具有登录功能的主页,我只需执行以下操作:

<html>
  Oh hey cool stuffz, sign up or login please
  <right column>
    @account()
  <end right column>
  @social() <!-- perhaps another template -->
<html>

我的设想是应用层将客户端到服务器的调用从模块抽象为 GUID,也许,因此进行“创建帐户”调用实际上会执行以下操作:

POST /35395235/:email account.create(password: String)

虽然我知道这不一定存在,但我偶然发现了 Lift,它似乎相对有前途,但仍然不像我希望的那样抽象。想法?

4

0 回答 0