ecomfe/er

Action.enter的建议

Closed this issue · 17 comments

在使用ER的时候,遇到了一些使用不便的地方,在这里说一下

  • ER 里面的 ActionModelView 没有构造函数初始化,不方便做初始化工作
  • 消息类事件监听不方便(onxxx的方式不好)
  • Model.loadDeferred 实现不友好,调试很不方便
  • model.datasource 请求不方便携带参数
  • Model.prototype.prepare 应该要先调用,而且应该有返回值,再执行fillset
  • Action.enter 的时候接口较少,不方便扩展
  • Action.prototype.enter中, createModel带了参数,后面就不需要再次fill
  • Action.prototype.forwardToView 中连续的三个操作 this.fire('rendered')this.initBehavior()this.fire('entercomplete') 可以合到一起了
  1. 已有计划,马上会为这3个加上initialize方法
  2. 不是有.on('xxx', handler)吗?
  3. Promise是业界标准,还请接受,对于调试可以通过Deferred.prototype.syncModeEnabled = true来提供调用堆栈信息,但不要打开此开头的情况下上线
  4. 为何不方便携带参数?你的代码提供一下吧
  5. 不理解,prepare的定义是在“数据源加载完后,在真正可用前,对加载的数据做进一步的处理”,你所需要的“先调用”是指在什么方法之前?
  6. 不太理解,你还希望哪些方面的扩展性?比如需要哪些额外的参数?
  7. 在开发分支上已经去除了
  8. 合到一起是指?在一些关键的方法前后有对应的事件是一种设计的理念

(2) 如果ER会自动完成一系列的工作,on('event', handler) 的入口在哪里或者或者在哪个阶段去监听呢
(3) Promise肯定没有问题,只是感觉调试有些麻烦
(4) 数据源是比较复杂的设计,真正的请求函数只传递了modeldatasource进去,没有参数吧
(5) model.load成功响应之后就做prepare处理,完成后自动填充进model里,就不用手动去set
(6) 比如model.load之前可能要做一些事情,渲染页面布局或框架之类的
(8) 嗯,是说这三个函数可以合并成一个消息事件

还是发svn看看比较方便,顺便学习学习

2.可以用er/events的``事件,这个事件在enter()调用之前触发,是个比较好的时机

  1. 你的参数具体是指什么,因为框架能给你的肯定只有modeldatasource,如果有些参数是你自己获取的,可以用闭包:

    var x = 1;
    var y = Math.random();

    datasource: {
    foo: function (model) {
    return x + y;
    }
    }

  2. 你的意思是prepare有返回值,然后这个返回值(一个对象?)填充到Model中吗?

  3. 注册Actionenter事件,这个事件在Model创建之前,符合你需要的时机

  4. 不是太理解……3个函数中有2个是事件,1个initBehavior是明显有逻辑的,合并成一个消息事件是指直接就只有一个事件,没有initBehavior这个提供重写的点了?

(1) er/events监听需要扩展到实例里面去;自定义子类中也可以监听,但是比较麻烦。
(2) 有个参数可以接受原始数据,经过处理,返回的数据自动setmodel里。
(3) enter 有点过早,viewcontainer 这些还没有初始化。
(4) 不论预留的接口是initBehavior还是fire('event')这三代码逻辑可以由一个接口去完成

能不能提供一个生成子类的方法啊?比如:

var ListAction = Action.extends({
    viewType: require('xxx'),
    modelType: require('xxx'),
    ...
});

每次都是先require一大堆,重写一大堆,继承。。。心情很烦躁啊有木有!

或者是由edp add提供这个功能,快速新建一个action-model-view-etpl

edp add er-aciton list

自动生成这些文件

  • List.js
  • ListModel.js
  • ListView.js
  • list.tpl.html

那些继承基类的代码自动给搞好

er/events监听需要扩展到实例里面去;自定义子类中也可以监听,但是比较麻烦。

你希望是怎么样的代码,是否可以给个示例的代码,我们再来看看怎么去支持

有个参数可以接受原始数据,经过处理,返回的数据自动set进model里。

所以还是想看下代希望的代码是怎么样子的……

enter 有点过早,view、container 这些还没有初始化。

ModelView之前,这是ER的机制决定的,你想要一个在load之前,又要在View之后,那ER无法提供了

我很理解你的需求,不过刚好是和ER不一样的一种交互方式。我并不太希望ER去支持2种路线,所以为此可能我会考虑插件或者别的机制,容我思考

不论预留的接口是initBehavior还是fire('event')这三代码逻辑可以由一个接口去完成

有点想不明白,求下你的代码,如何一个接口来完成,或者提交pull request也行

能不能提供一个生成子类的方法啊?

我一直认为inherits这事不应该由ER或者ESUI任何一个框架来做,而是应该有一个独立的管理类型创建和继承的库

@leeight@errorrik 对这个什么想法?是不是弄个很精简的库专门做这事

或者是由edp add提供这个功能

这事在我们联盟前端的ub-ria-tool里有,仅针对我们的各个系统定制。

关键是各个项目的目录结构不一定一样,话说你那边不是这种结构么:

/src
    /foo
        /list
            Action.js
            Model.js
            View.js

我们和ef的完全一样

src/
    plan/
         List.js     // 这是aciton
         ListModel.js // 这是model
         ListView.js   // 这里view

那么这个后续作为edp-codegen的插件来做一下吧:)

是否可以这样考虑,提供一个接口,扩展父类

var ChildAction = Action.extend({

    // 初始化方法
    // 在 Action.apply(this, arguments) 之后调用
    initialize: function() {

        // 注册ER的消息事件
        this.on('enter', handler);
    }
});

对于Action.enter,在 Action.forwardToView里面最后的处理中,留一个接口

this.fire('rendered');

后面两个方法

this.initBehavior();
this.entercomplete();

使用者可以在rendered的监听中处理。

是否可以这样考虑,提供一个接口,扩展父类

上面说了,我认为这事不应该ER提供,考虑单独的库来吧……

对于Action.enter,在 Action.forwardToView里面最后的处理中,留一个接口,后面两个方法

这似乎就是把我的fire('entercomplete')改成了entercomplete()方法?但原来的事件也能加个onentercomplete方法,多个事件的缺点是什么……?

只有一个方法,意味着只能重写一次,而事件本身是多播的有明显优势,至少管家现在就有不下3处注册了entercomplete事件的地方,用来记录日志、作导航条具体item高亮等工作

上面说了,我认为这事不应该ER提供,考虑单独的库来吧

恩,单独的库吧。

ub-ria-tool

有没有必要改吧改吧,弄成edp的扩展?例如edpx-ub-ria,然后就可以用edp ub-ria的方式来使用了,然后也就可以弄edpx-ma-ria的扩展了。

@Justineo

嗯,会的,等我这阵子杂七杂八的事结束了,或者我找到人来搞这个……

那我来找人搞吧,这样子发布1.0.0的时候,能多打包点儿东西~~~

这个问题还有进一步的讨论吗?考虑在近几周发布3.1.0 beta版,之后对新的功能需求会很谨慎地去接受