Cra*_*tis 5 javascript ember.js
在Ember中,假设我有一个名为的对象FoodStuff具有一些属性:
export default Ember.Object.extend({
name: null, // REQUIRED: 'Slice of Apple Pie'
calories: null, // OPTIONAL: int: eg. 250
category: null, // REQUIRED: 'Pastry'
rating: null // OPTIONAL: int: 1-5
});
Run Code Online (Sandbox Code Playgroud)
如何在Ember中编写"构造函数",要求在实例化时提供"名称"和"类别"属性?
Angular似乎用相当简单的语法来解决这个问题:
.factory('User', function (Organisation) {
/**
* Constructor, with class name
*/
function User(firstName, lastName, role, organisation) {
// Public properties, assigned to the instance ('this')
this.firstName = firstName;
...
Run Code Online (Sandbox Code Playgroud)
Ember有类似的东西吗?目前我的所有类都在顶部看到,有一堆初始为null的属性,调用者可能正确设置也可能没有.在构建时(我正在使用ember-cli),我希望在ember buildJSHint阶段的下游捕获构造函数需求的更改.
小智 2
据我所知,Ember 中没有本地方法可以做到这一点。但没有什么是不可能的!您可以稍微调整 Ember 来处理这种情况。只需添加一个初始化程序:
/initializers/extend-ember.js:
import Ember from 'ember';
export function initialize() {
Ember.Object.reopen({
/**
* @prop {Array} - array of required properties
*/
requiredAttrs: [],
/**
* Validates existance of required properties
*
* @param {String} attr - attribute name
* @param {*} value - value of the property
* @throws {Error} in case when required property is not set
*/
_validateExistance(attr, value) {
if (this.requiredAttrs.contains(attr) && typeof value === "undefined") {
throw new Error("Attribute " + attr + " can't be empty!");
}
},
/**
* Sets value of a property and validates existance of required properties
*
* @override
*/
set(key, value) {
this._validateExistance(key, value);
return this._super(key, value);
}
});
Ember.Object.reopenClass({
/**
* Creates object instance and validates existance of required properties
*
* @override
*/
create(attrs) {
let obj = this._super(attrs);
if (attrs) {
obj.requiredAttrs.forEach((key) => {
obj._validateExistance(key, attrs[key]);
});
}
return obj;
}
});
}
export default {
name: 'extend-ember',
initialize: initialize
};
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用requiredAttrs任何类上的属性来定义需要哪些属性。如果您尝试创建具有空必需属性的实例,或者尝试将空值设置为必需属性,它将引发异常。
let MyModel = Ember.Object.extend({
prop1: null,
prop2: null,
requiredAttrs: ['prop2']
});
let ChildModel = MyModel.extend({
prop3: null,
requiredAttrs: ['prop2', 'prop3']
});
// throws exception
let obj1 = MyModel.create({
prop1: 'val1'
});
// no exception
let obj2 = MyModel.create({
prop2: 'val2'
});
// throws exception
obj2.set('prop2', undefined);
// throws exception
let obj3 = ChildModel.create({
prop3: 'val3'
});
// no exception
let obj4 = ChildModel.create({
prop2: 'val2',
prop3: 'val3'
});
Run Code Online (Sandbox Code Playgroud)
它也适用于DS.Model开箱即用的其他 Ember 实体,因为它们都扩展了Ember.Object.
| 归档时间: |
|
| 查看次数: |
442 次 |
| 最近记录: |