敲除绑定继承的javascript对象
我有两种类似的活动:敲除绑定继承的javascript对象,javascript,knockout.js,Javascript,Knockout.js,我有两种类似的活动: function Activity(type, name) { this.Type = type this.Name = ko.observable(name) } function MeetingActivity(name, place) { Activity.call(this, 1500, name) this.Place = ko.observable(place) } function TeachingActivity(name, place,
function Activity(type, name) {
this.Type = type
this.Name = ko.observable(name)
}
function MeetingActivity(name, place) {
Activity.call(this, 1500, name)
this.Place = ko.observable(place)
}
function TeachingActivity(name, place, teacherId) {
Activity.call(this, 1600, name)
this.Place = ko.observable(place)
this.TeacherId = ko.observable(teacherId)
}
Activity:
<select data-bind='value: ActivityTypeId'>
<option value='1500'>Meeting</option>
<option value='1600'>Teaching</option>
</select>
<div data-bind='if: ActivityTypeId()==1500'>
<div data-bind='with: Activity'>
<span data-bind='text:Name'></span>
<span data-bind='text:Place'></span>
</div>
</div>
<div data-bind='if: ActivityTypeId()==1600'>
<div data-bind='with: Activity'>
<span data-bind='text:Name'></span>
<span data-bind='text:Place'></span>
<span data-bind='text:TeacherId'></span>
</div>
</div>
并尝试将不同类型的活动绑定到以下容器:
function Activity(type, name) {
this.Type = type
this.Name = ko.observable(name)
}
function MeetingActivity(name, place) {
Activity.call(this, 1500, name)
this.Place = ko.observable(place)
}
function TeachingActivity(name, place, teacherId) {
Activity.call(this, 1600, name)
this.Place = ko.observable(place)
this.TeacherId = ko.observable(teacherId)
}
Activity:
<select data-bind='value: ActivityTypeId'>
<option value='1500'>Meeting</option>
<option value='1600'>Teaching</option>
</select>
<div data-bind='if: ActivityTypeId()==1500'>
<div data-bind='with: Activity'>
<span data-bind='text:Name'></span>
<span data-bind='text:Place'></span>
</div>
</div>
<div data-bind='if: ActivityTypeId()==1600'>
<div data-bind='with: Activity'>
<span data-bind='text:Name'></span>
<span data-bind='text:Place'></span>
<span data-bind='text:TeacherId'></span>
</div>
</div>
活动:
会合
教学
我写信是为了把事情办好,但运气不好,我做错了什么?您提供的小提琴的错误来自
订阅ActivityTypeId的方法。请记住,创建函数时,此
会被当前函数范围覆盖,因此活动
现在会丢失在当前的此
中
function ViewModel() {
this.ActivityTypeId = ko.observable(1500);
this.Activity = ko.observable(new MeetingActivity('meeting 1', 'g12', 155))
this.ActivityTypeId.subscribe(function(typeId) {
if (typeId == 1500) this.Activity(new MeetingActivity('meeting 1', 'g12'))
else if (typeId == 1600) this.Activity(new TeachingActivity('meeting 2', 'g13', 155))
})
}
要修复它,您可以将其分配给另一个变量并通过它访问活动。比如:
function ViewModel() {
var self = this; //this is what i meant in assigning in another variable
this.ActivityTypeId = ko.observable(1500);
this.Activity = ko.observable(new MeetingActivity('meeting 1', 'g12', 155))
this.ActivityTypeId.subscribe(function(typeId) {
if (typeId == 1500) self.Activity(new MeetingActivity('meeting 1', 'g12')) //use self on accessing Activity
else if (typeId == 1600) self.Activity(new TeachingActivity('meeting 2', 'g13', 155)) //use self on accessing Activity
})
}
您提供的小提琴错误来自ActivityTypeId
的subscribe
方法。请记住,创建函数时,此
会被当前函数范围覆盖,因此活动
现在会丢失在当前的此
中
function ViewModel() {
this.ActivityTypeId = ko.observable(1500);
this.Activity = ko.observable(new MeetingActivity('meeting 1', 'g12', 155))
this.ActivityTypeId.subscribe(function(typeId) {
if (typeId == 1500) this.Activity(new MeetingActivity('meeting 1', 'g12'))
else if (typeId == 1600) this.Activity(new TeachingActivity('meeting 2', 'g13', 155))
})
}
要修复它,您可以将其分配给另一个变量并通过它访问活动。比如:
function ViewModel() {
var self = this; //this is what i meant in assigning in another variable
this.ActivityTypeId = ko.observable(1500);
this.Activity = ko.observable(new MeetingActivity('meeting 1', 'g12', 155))
this.ActivityTypeId.subscribe(function(typeId) {
if (typeId == 1500) self.Activity(new MeetingActivity('meeting 1', 'g12')) //use self on accessing Activity
else if (typeId == 1600) self.Activity(new TeachingActivity('meeting 2', 'g13', 155)) //use self on accessing Activity
})
}
您的问题是您更新了活动
以包含一个新类型,并且显示更改为显示该类型,但是在某个时候,所包含的类型和预期显示的类型将不相同
为了确保没有同步问题,您应该测试活动。键入(应该是可观察的)。此外,与其将活动
设置为可观察的,并订阅更改其值,不如将其设置为可计算的
功能活动(类型、名称){
this.Type=ko.observable(Type)
this.Name=ko.observable(Name)
}
职能会议活动(名称、地点){
Activity.call(this,1500,name)
此位置=可观察的(位置)
}
功能教学活动(姓名、地点、教师ID){
Activity.call(this,1600,name)
此位置=可观察的(位置)
this.TeacherId=ko.可观察(TeacherId)
}
函数ViewModel(){
var self=这个
self.activitypeid=ko.可观察(1500);
self.Activity=ko.computed(
函数(){
var typeId=+self.activitypeid();
如果(typeId==1500)返回新的会议活动(“会议1”、“g12”);
否则,如果(typeId==1600)返回新的教学活动(“会议2”、“g13”和“155”);
else console.warn('Type ID:',typeId');
});
}
var VM=null
$(文档).ready(函数(){
VM=新的ViewModel()
高级应用绑定(VM)
控制台日志(VM)
})
活动:
会合
教学
您的问题是您更新了活动以包含一个新类型,并且显示更改为显示该类型,但是在某个时候,所包含的类型和预期显示的类型将不相同
为了确保没有同步问题,您应该测试活动。键入(应该是可观察的)。此外,与其将活动
设置为可观察的,并订阅更改其值,不如将其设置为可计算的
功能活动(类型、名称){
this.Type=ko.observable(Type)
this.Name=ko.observable(Name)
}
职能会议活动(名称、地点){
Activity.call(this,1500,name)
此位置=可观察的(位置)
}
功能教学活动(姓名、地点、教师ID){
Activity.call(this,1600,name)
此位置=可观察的(位置)
this.TeacherId=ko.可观察(TeacherId)
}
函数ViewModel(){
var self=这个
self.activitypeid=ko.可观察(1500);
self.Activity=ko.computed(
函数(){
var typeId=+self.activitypeid();
如果(typeId==1500)返回新的会议活动(“会议1”、“g12”);
否则,如果(typeId==1600)返回新的教学活动(“会议2”、“g13”和“155”);
else console.warn('Type ID:',typeId');
});
}
var VM=null
$(文档).ready(函数(){
VM=新的ViewModel()
高级应用绑定(VM)
控制台日志(VM)
})
活动:
会合
教学
是,奇怪的错误:“未捕获类型错误:无法处理绑定”值:函数(){return ActivityTypeId}“消息:this.Activity不是函数”我仔细检查了这个.Activity是否在视图模型中定义了activitypeid
是如何定义的?在使用when
绑定处理if
时,Knockout似乎是一个bug。如果您用:Activity
摆脱,只需使用text:Activity().Name/Place/TeacherId
就可以了。@haim770我删除了'with',但同样的错误,在将活动变量从教学更改为会议时删除TeacherId属性时似乎出现了问题,@RoyJ请查看小提琴是的,奇怪的错误:“未捕获类型错误:无法处理绑定”值:函数(){return activitypeid}“消息:this.Activity不是函数“我仔细检查了这个.Activity是否在视图模型中定义了activitypeid
是如何定义的?在使用when
绑定处理if
时,Knockout似乎是一个bug。如果你用:Activity
摆脱,只需使用text:Activity().Name/Place/TeacherId
就可以了。@haim770我删除了'with',但同样的错误,在将活动变量从教学改为会议时删除TeacherId属性时似乎出现了问题,@RoyJ请看一下小提琴谢谢,我要重点解决的主要错误是将活动从“教学”改为“会议”。错误为“未捕获引用错误:无法处理绑定”text:function(){return TeacherId}“消息:TeacherId未定义”谢谢,我要解决的主要错误是将活动从“教学”更改为“会议”。错误为“未捕获引用错误:无法处理绑定”文本:函数(){return TeacherId}“消息:TeacherId i