Jquery 如何使用;加上;使用嵌套视图模型绑定淘汰JS?
我正试图写一个模板来填写多人的表格。我不想使用“foreach”绑定或模板。我只是想用一个按钮将所有数据保存在一个简单的表单中,该表单包含5个输入,该按钮将把这个人添加到observableArray中,并为下一个人清除表单 我已将我的全部代码粘贴到下面:Jquery 如何使用;加上;使用嵌套视图模型绑定淘汰JS?,jquery,html,knockout.js,knockout-3.0,Jquery,Html,Knockout.js,Knockout 3.0,我正试图写一个模板来填写多人的表格。我不想使用“foreach”绑定或模板。我只是想用一个按钮将所有数据保存在一个简单的表单中,该表单包含5个输入,该按钮将把这个人添加到observableArray中,并为下一个人清除表单 我已将我的全部代码粘贴到下面: <html> <head> <title>Test Knockouts</title> </head> <body> <div id="rootDi
<html>
<head>
<title>Test Knockouts</title>
</head>
<body>
<div id="rootDiv">
<ul data-bind="with: Person">
<li data-bind="event: { click: $data.setupPersonTypeForm.bind($data, 'Member') }">
<a href="#" aria-controls="home">
<span class="radio-label">Member</span>
</a>
</li>
<li data-bind="event: { click: $data.setupPersonTypeForm.bind($data, 'Guest') }">
<a href="#" aria-controls="messages">
<span class="radio-label">Guest</span>
</a>
</li>
<li data-bind="event: { click: $data.setupPersonTypeForm.bind($data, 'Employee') }">
<a href="#" aria-controls="profile">
<span class="radio-label">Employee</span>
</a>
</li>
</ul>
<div>
Person Name:
<input type="text" data-bind="text: PersonName" /><br />
Person Age:
<input type="text" data-bind="text: PersonAge" /><br />
Person Type:
<input type="text" data-bind="text: PersonType" /><br />
Person Country:
<input type="text" data-bind="text: PersonCountry" /><br />
Person NetWorth:
<input type="text" data-bind="text: PersonNetWorth" />
</div>
</div>
<script src="jquery-2.1.4.js"></script>
<script src="knockout-3.4.0.js"></script>
<script type="text/javascript">
$(document).ready(function (e) {
var element = document.getElementById("rootDiv");
ko.applyBindings(rootVM, element);
var RootVM = function (data) {
var self = this;
self.Id = ko.observable();
self.Name = ko.observable();
self.Location = ko.observable();
self.TypeId = ko.observable();
self.Age = ko.observable();
self.Person = ko.observableArray([new PersonVM()]);
}
var rootVM = new RootVM();
var PersonVM = function (data) {
var self = this;
self.Id = ko.observable();
self.PersonName = ko.observable();
self.PersonType = ko.observable();
self.PersonAge = ko.observable();
self.PersonCountry = ko.observable();
self.PersonNetWorth = ko.observable();
self.PersonTypeIdPlaceholder = ko.observable();
self.ShowEmployeeTitleField = ko.observable(false);
self.setupPersonTypeForm = function (personType) {
self.ShowEmployeeTitleField(false);
switch (personType) {
case "Member":
self.PersonTypeIdPlaceholder("Member ID");
break;
case "Guest":
self.PersonTypeIdPlaceholder("Guest ID");
break;
case "Employee":
self.PersonTypeIdPlaceholder("Employee ID");
self.ShowEmployeeTitleField(true);
break;
}
}
self.setupPersonTypeForm('Member');
self.Property = ko.observableArray([new PropertyVM()]);
}
var PropertyVM = function (data) {
var self = this;
self.Id = ko.observable();
self.PropertyPlace = ko.observable();
self.PropertySize = ko.observable();
self.PropertyName = ko.observable();
self.PropertyAge = ko.observable();
}
});
</script>
</body>
</html>
测试淘汰赛
-
-
-
人名:
人龄:
人员类型:
个人国家:
个人网络:
$(文档).ready(函数(e){
var元素=document.getElementById(“rootDiv”);
应用绑定(rootVM,元素);
var RootVM=函数(数据){
var self=这个;
self.Id=ko.observable();
self.Name=ko.observable();
self.Location=ko.observable();
self.TypeId=ko.observable();
自我年龄=可观察();
self.Person=ko.observearray([newpersonvm()]);
}
var rootVM=新的rootVM();
var PersonVM=函数(数据){
var self=这个;
self.Id=ko.observable();
self.PersonName=ko.observable();
self.PersonType=ko.observable();
self.PersonAge=ko.observable();
self.PersonCountry=ko.observable();
self.PersonNetWorth=ko.observable();
self.PersonTypeIdPlaceholder=ko.observable();
self.ShowEmployeeTitleField=ko.可观察(假);
self.setupPersonTypeForm=函数(personType){
self.ShowEmployeeTitleField(假);
开关(个人类型){
案例“成员”:
self.personTypedPlaceHolder(“会员ID”);
打破
案例“来宾”:
self.personTypedPlaceHolder(“客人ID”);
打破
案例“雇员”:
self.personTypedPlaceHolder(“员工ID”);
self.ShowEmployeeTitleField(真);
打破
}
}
self.setupPersonTypeForm(“成员”);
self.Property=ko.observearray([newpropertyvm()]);
}
var PropertyVM=函数(数据){
var self=这个;
self.Id=ko.observable();
self.PropertyPlace=ko.observable();
self.PropertySize=ko.observable();
self.PropertyName=ko.observable();
self.PropertyAge=ko.observable();
}
});
我得到以下错误:
knockout-3.4.0.js:72未捕获的引用错误:无法处理
绑定“with:function(){return Person}”消息:Person不是
明确的
我哪里出了问题
任何帮助都将不胜感激 从这一行开始:
ko.applyBindings(rootVM, element);
…rootVM
是未定义的
,您尚未为其分配任何值。您想将其移动到后的
var rootVM = new RootVM();
…这反过来需要在
var PersonVM = function (data) { ... };
…因为它使用PersonVM
只悬挂声明,不悬挂作业。如果您有:
(function() {
console.log(foo);
var foo = 42;
})();
…您看到的是未定义的,而不是42,因为该代码被解释为:
(function() {
var foo = undefined;
console.log(foo);
foo = 42;
})();
这在你的代码中一直在发生
至少还有几个其他问题:
您使用的是Person
,就好像它是一个单一的东西,但您将它定义为一个事物数组。一旦解决了上述问题,就会出现这样一个问题:单击
事件无法绑定,因为数组没有setupPersonTypeForm
方法(您的人员
有,而不是它所在的数组)
您正在使用列表下方的属性,这些属性仅存在于Person
上,但仅在列表上使用带有:Person的
如果您的目标是拥有一个人员列表,并且能够使用表单添加/编辑该列表中的人员,那么将演示如何使用“项目”而不是“人员”来完成几乎相同的操作
下面是一个简单的例子,答案在上下文中重复:
功能项目(标题、优先级){
this.title=ko.observable(title | |“”);
this.priority=ko.observable(priority | | |“Medium”);
}
函数ProjectViewModel(){
var self=这个;
this.priorityOptions=ko.observearray([“高”、“中”、“低”);
this.projects=ko.observearray();
this.editing=ko.observable(新项目());
this.addProject=函数(){
this.projects.push(this.editing());
编辑(新项目());
};
}
ko.applyBindings(新的ProjectViewModel(),document.body)代码>
标题:
优先:
添加项目
项目:
()
从此行开始:
ko.applyBindings(rootVM, element);
…rootVM
是未定义的
,您尚未为其分配任何值。您想将其移动到后的
var rootVM = new RootVM();
…这反过来需要在
var PersonVM = function (data) { ... };
…从那以后