Javascript 在敲除中引用对象构造函数外部视图模型的属性
所以,我不完全确定如何表达这个问题,因为这是一个二合一的问题。我遇到了一个奇怪的问题,我有一个对象构造函数从HTML表单创建新的“项目”,然后在提交表单时将其推送到ObservalArray中。一切都很好,但要引用相关的观察值,我必须使用“value:Project.title”或“value:Project.whatever”。在我所看到的任何示例中,我都没有看到“value:NameOfConstructor.property”。我假设这样做是因为构造函数在我的视图模型之外 我的问题是:有没有更好的方法来分配视图模型中没有的构造函数中的属性值?换句话说,有没有比“Project.title”等更好或更正确的方法? 我问的部分原因是我的代码中有一件事目前不起作用;knockout enable属性在我的“New Project”按钮上不起作用,即使“title”输入框中写入了某些内容,它也会保持禁用状态。我觉得这是因为它是以data bind='enable:Project.title'的形式编写的,但我不知道还有什么其他方法可以编写它 我已经包含了一个JSFIDLE供参考,尽管它显然因为外部依赖而无法工作。 我的HTML:Javascript 在敲除中引用对象构造函数外部视图模型的属性,javascript,knockout.js,Javascript,Knockout.js,所以,我不完全确定如何表达这个问题,因为这是一个二合一的问题。我遇到了一个奇怪的问题,我有一个对象构造函数从HTML表单创建新的“项目”,然后在提交表单时将其推送到ObservalArray中。一切都很好,但要引用相关的观察值,我必须使用“value:Project.title”或“value:Project.whatever”。在我所看到的任何示例中,我都没有看到“value:NameOfConstructor.property”。我假设这样做是因为构造函数在我的视图模型之外 我的问题是:有没
<form id='addBox' action='#' method='post'>
<label for='pTitle'> Title: </label>
<input id='pTitle' data-bind='value: Project.title' />
<br/>
<label for='pPriority'> Priority </label>
<select id='pPriority' data-bind='options: priorityOptions, value: Project.priority'></select>
<br/>
<button data-bind='enable: Project.title, click: newProject'>New Project</button>
</form>
最后,如果我错过了任何发布约定,或者如果我的代码特别糟糕,我道歉。我很新,还在自学。您的代码正在为
新建项目
创建的对象设置标题
和优先级
属性,但稍后您会在项目
本身上看到这些属性。它没有它们<代码>项目是函数,而不是由新项目
创建的对象。因此Project.title
和Project.priority
将为您提供未定义的
(并且不是可观察的,因此对值
绑定来说不是有用的目标)
相反,使用一个“编辑”项目
实例,将输入的值
绑定到编辑的“实例”标题
和优先级
,然后在新建项目
中抓取该实例,并将其替换为新的、新的实例
粗略地说,在ProjectViewModel
的构造函数中:
this.editing = ko.observable(new Project());
将项目
更新为默认的标题
和优先级
:
function Project(title, priority) {
this.title = ko.observable(title || "");
this.priority = ko.observable(priority || "Medium");
}
在绑定中:
<input id='pTitle' data-bind='value: editing().title' />
<select id='pPriority' data-bind='options: priorityOptions, value: editing().priority'></select>
然后在添加到数组时使用np
(而不是另一个新项目
)
下面是一个简化的示例:
功能项目(标题、优先级){
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)代码>
标题:
优先:
添加项目
项目:
()
不相关,但是通过将表单控件放在标签中,您可以通过for
/id
避免所有繁琐的表单控件与标签链接。哈哈,这会节省我一些时间。很高兴知道!谢谢。啊,这个很好用。我不得不在HTML中做一些修改,特别是我的foreach中- 元素的文本(显示在小提琴上,但不是帖子,因为我认为它不相关)必须从“title”更改为“title()”。否则这是相当有效的。我为var np的奇怪之处道歉,我只是在发布之前没有清理我的代码。谢谢你的帮助。
<input id='pTitle' data-bind='value: editing().title' />
<select id='pPriority' data-bind='options: priorityOptions, value: editing().priority'></select>
var np = this.editing();
this.editing(new Project());