第五章 抽象模型
抽象模型(AbstractModel)是MVC中的M部分,提到MVC的M我们一般都倾向于服务端的概念,但是这里我们的说的是Web端的概念。Model的职责是获取相关数据供视图的其他组件使用,当然视图中数据的变化也应该及时传递给Model。Model并非一个Widget,它不需要用来渲染和展示。但是,它是EventDispatcherMixin的子类,也就是说,它可以通过事件冒泡的方式与父类通信。
var AbstractModel = mvc.Model.extend({
//--------------------------------------------------------------------------
// Public
//--------------------------------------------------------------------------
/**
* When something changes, the data may need to be refetched. This is the
* job for this method: reloading (only if necessary) all the data and
* making sure that they are ready to be redisplayed.
*
* @param {Object} params
* @returns {Promise}
*/
reload: function (params) {
return Promise.resolve();
},
/**
* Processes date(time) and selection field values sent by the server.
* Converts data(time) values to moment instances.
* Converts false values of selection fields to 0 if 0 is a valid key,
* because the server doesn't make a distinction between false and 0, and
* always sends false when value is 0.
*
* @param {Object} field the field description
* @param {*} value
* @returns {*} the processed value
*/
_parseServerValue: function (field, value) {
if (field.type === 'date' || field.type === 'datetime') {
// process date(time): convert into a moment instance
value = fieldUtils.parse[field.type](value, field, {isUTC: true});
} else if (field.type === 'selection' && value === false) {
// process selection: convert false to 0, if 0 is a valid key
var hasKey0 = _.find(field.selection, function (option) {
return option[0] === 0;
});
value = hasKey0 ? 0 : value;
}
return value;
},
});
抽象模型的代码很少,只是在mvc的Model模型基础上新增了两个方法:
- reload: reload方法的目的是为了在必要时重新获取数据,这里只是方法定义,具体的实现需要子类自行实现。
- _parseServerValue: _parseServerValue的作用是处理服务端传回的时间日期类型和选择类型的数据。对于时间日期类型,_parseServerValue方法会将其转换为瞬时对象。对于选择类型,将会将false转换为0(因为服务器端总会将0转换为false进行传递)。