扩展基类属性
Extending base-class properties
如何从knockout.js中的基类扩展属性?
我试图在我的视图模型中设置敲除验证,但除非我的"子类"有一个也是extended
的可观察对象,否则它不会起作用。请参阅下面代码片段中的注释:
// setup knockout validation
ko.validation.rules.pattern.message = 'Invalid.';
ko.validation.configure({
registerExtenders: true,
messagesOnModified: true,
insertMessages: true
});
// base 'class'
function userAddressModelBase(data) {
var self = this;
self.firstName = ko.observable(data.firstName);
self.lastName = ko.observable(data.lastName);
}
userAddressModel.prototype = new userAddressModelBase({});
userAddressModel.constructor = userAddressModel;
// 'sub-class'
function userAddressModel(data) {
var self = this;
userAddressModelBase.call(self, data);
// extend 'base-class' properties; this doesn't work unless the current 'sub-class' also has an observable who is also extended...
self.firstName.extend({ required: true });
self.lastName.extend({ required: true });
// the above statement only starts working if I extend an observable from this `sub-class`
self.city = ko.observable();//.extend({ required: true });
self.errors = ko.validation.group(self);
self.validate = function() {
console.log(self.errors().length);
if (self.errors().length > 0) {
self.errors.showAllMessages();
return;
}
};
}
var model = new userAddressModel({ firstName: "Ted" });
ko.applyBindings(model);
.validationMessage{
color: #ea033d;
font-weight: 700;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div>
<label>First Name: <input type="text" data-bind="value: firstName" /></label><br>
<label>Last Name: <input type="text" data-bind="value: lastName" /></label><br>
<label>City: <input type="text" data-bind="value: city" /></label><br>
<button data-bind="click: validate">Validate</button>
</div>
执行继承的推荐方法是使用ko.utils.extend(self, new userAddressModelBase(data));
function userAddressModelBase(data) {
var self = this;
self.firstName = ko.observable(data.firstName);
self.lastName = ko.observable(data.lastName);
}
下面我使用extend为firstName和lastName添加所需的验证。
function userAddressModel(data) {
var self = this;
ko.utils.extend(self, new userAddressModelBase(data))
self.firstName.extend({ required: true });
self.lastName.extend({ required: true });
};
现在,在该示例中,如果删除firstName,然后退出文本框,您可以看到显示所需的消息。
http://jsfiddle.net/d4vLqkx2/1/
相关文章:
- ES6构造函数返回基类的实例
- 如何通过Prototype或jquery移除子类的父类基类
- 是受(GWT)基类中方法数量影响的JavaScript对象的大小
- Javascript继承的问题&基类原型
- 如何从json函数访问javascript中的基类变量
- ExtJS4 - 从单个基类扩展不同的组件
- 从继承的实例创建 JavaScript 基类对象
- 将“属性”或类添加到变量
- 在 JavaScript 中按属性查找类实例
- Javascript子类对象不保留基类的属性/方法
- Javascript子类化,超级构造函数和使用自定义扩展会丢失基类方法
- 按属性或类而不是 ID 附加 Dojo 工具提示
- 如何在angularjs中为CRUD做基类概念
- ExtJS:在哪里定义基类的原型扩展
- Javascript“基类”中的简单“静态”
- jquery按属性和类获取元素
- 扩展基类属性
- 为什么基类的对象属性与子类的所有实例共享?
- “super”可以调用基类的方法和属性
- ES6类:我怎么得到这个?属性在基类构造函数中分配给派生类原型