Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Action.enter的建议 #105

Closed
lylijincheng opened this issue Mar 20, 2014 · 17 comments
Closed

Action.enter的建议 #105

lylijincheng opened this issue Mar 20, 2014 · 17 comments
Milestone

Comments

@lylijincheng
Copy link

在使用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') 可以合到一起了
@otakustay
Copy link
Member

  1. 已有计划,马上会为这3个加上initialize方法
  2. 不是有.on('xxx', handler)吗?
  3. Promise是业界标准,还请接受,对于调试可以通过Deferred.prototype.syncModeEnabled = true来提供调用堆栈信息,但不要打开此开头的情况下上线
  4. 为何不方便携带参数?你的代码提供一下吧
  5. 不理解,prepare的定义是在“数据源加载完后,在真正可用前,对加载的数据做进一步的处理”,你所需要的“先调用”是指在什么方法之前?
  6. 不太理解,你还希望哪些方面的扩展性?比如需要哪些额外的参数?
  7. 在开发分支上已经去除了
  8. 合到一起是指?在一些关键的方法前后有对应的事件是一种设计的理念

@lylijincheng
Copy link
Author

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

@leeight
Copy link
Member

leeight commented Mar 20, 2014

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

@otakustay
Copy link
Member

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这个提供重写的点了?

@lylijincheng
Copy link
Author

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

@jinzhubaofu
Copy link

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

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

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

@otakustay
Copy link
Member

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

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

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

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

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

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

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

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

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

@otakustay
Copy link
Member

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

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

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

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

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

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

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

@jinzhubaofu
Copy link

我们和ef的完全一样

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

@otakustay
Copy link
Member

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

@lylijincheng
Copy link
Author

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

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的监听中处理。

@otakustay
Copy link
Member

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

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

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

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

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

@leeight
Copy link
Member

leeight commented Mar 20, 2014

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

恩,单独的库吧。

@leeight
Copy link
Member

leeight commented Mar 20, 2014

ub-ria-tool

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

@Justineo

@otakustay
Copy link
Member

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

@leeight
Copy link
Member

leeight commented Mar 20, 2014

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

@otakustay
Copy link
Member

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

@otakustay otakustay added this to the 3.1.0 milestone Apr 3, 2014
otakustay added a commit that referenced this issue Apr 3, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants