视图行为笨拙

Posted

技术标签:

【中文标题】视图行为笨拙【英文标题】:Views behave awkwardly 【发布时间】:2014-01-01 09:42:04 【问题描述】:

考虑 Backbone.js 源代码的一部分:

// List of view options to be merged as properties.
var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];

var View = Backbone.View = function(options) 
    this.cid = _.uniqueId('view');
    options || (options = );
    _.extend(this, _.pick(options, viewOptions));
    this._ensureElement();
    this.initialize.apply(this, arguments);
    this.delegateEvents();
;

我想知道为什么只有 'model'、'collection'、'el'、'id'、'attributes'、'className'、'tagName'、'events' 被分配给 View 实例。我觉得这很烦人。我通常需要发送一些额外的参数。是否可以将_.extend(this, _.pick(options, viewOptions)); 替换为 _.extend(this, options));?

【问题讨论】:

【参考方案1】:

为什么不将额外数据存储在属性哈希中?

如果您真的想直接在视图上设置其他属性,您也可以将其作为属性选项传入,然后在初始化方法中将其设置在视图对象上:

var MyView = Backbone.View.extend(
    initialize: function() 
        var self = this;

        if (this.attributes) 
            _.each(this.attributes, function(val, key) 
                self[key] = val;
            );
        
    
);

var view = new MyView( attributes:  foo: 'bar'  );

【讨论】:

确实我现在使用类似的代码。我想知道var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];背后的原因 啊。是的,我不知道白名单背后的原因。也许是为了保持***视图属性整洁。或者使用 attributes 属性在视图中存储任意数据是为了与模型的实现方式保持一致?我想我的倾向通常只是为了避免修改第三方源代码:)

以上是关于视图行为笨拙的主要内容,如果未能解决你的问题,请参考以下文章

滚动视图行为不正常?

视图的奇怪行为

刷新物化视图:并发、事务行为

Icecream Sandwich 视图行为

将应用栏滚动视图行为添加到 CoordinatorLayout 中的多个视图

集合视图单元格的自动布局行为怪异