Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
敲除绑定继承的javascript对象_Javascript_Knockout.js - Fatal编程技术网

敲除绑定继承的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