Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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,所以,我不完全确定如何表达这个问题,因为这是一个二合一的问题。我遇到了一个奇怪的问题,我有一个对象构造函数从HTML表单创建新的“项目”,然后在提交表单时将其推送到ObservalArray中。一切都很好,但要引用相关的观察值,我必须使用“value:Project.title”或“value:Project.whatever”。在我所看到的任何示例中,我都没有看到“value:NameOfConstructor.property”。我假设这样做是因为构造函数在我的视图模型之外 我的问题是:有没

所以,我不完全确定如何表达这个问题,因为这是一个二合一的问题。我遇到了一个奇怪的问题,我有一个对象构造函数从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:

<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());