Knockout.js 敲除-对象和视图的数组,对吗?

Knockout.js 敲除-对象和视图的数组,对吗?,knockout.js,Knockout.js,我有一个对象数组,其中每个对象表示视图的数据。我想为每个对象初始化一组属性,以便可以轻松地从一个函数添加到对象上。我这样做是这样的 var createViewProperties = function () { return { rightContentVisibility: ko.observable(true) // normally false, true for testing }; }; var data= [

我有一个对象数组,其中每个对象表示视图的数据。我想为每个对象初始化一组属性,以便可以轻松地从一个函数添加到对象上。我这样做是这样的

var createViewProperties = function () {
        return {
            rightContentVisibility: ko.observable(true) // normally false, true for testing
        };
    };

var data= [
   {
     headline: "Are you interested in helping others?",
     viewProperties: new createViewProperties(),
   },
   {
     headline: "This is a second modal view",
     viewProperties: new createViewProperties(),
   }
];
然后找到要显示的适当对象并更新视图模型的对象。在HTML中,我这样绘制视图

<div data-bind="with: currentView">
     <div data-bind="css: $data.headline" class="cover-img"></div>
     <div data-bind="$data.viewProperties.rightContentVisibility"></div>
</div>


但是浏览器的.rightContentVisibility未定义,我是否没有正确实例化这些对象?当我在对象上暂停调试器时,它似乎拥有整个observable.viewProperties,但一旦它进入dom,它就不知道它是什么,这里出了什么问题

如果这样做,那么代码应该可以正常工作,不会出现任何错误。检查您的
ko.applyBindings()
调用-可能您在那里有错误

var createViewProperties=函数(){
返回{
rightContentVisibility:ko.observable(true)//通常为false,测试为true
};
};
风险值数据=[
{
标题:“你有兴趣帮助别人吗?”,
viewProperties:新建createViewProperties(),
},
{
标题:“这是第二种模式视图”,
viewProperties:新建createViewProperties(),
}
];
应用绑定({currentView:data})

如果您这样做,那么代码应该可以正常工作,不会出现任何错误。检查您的
ko.applyBindings()
调用-可能您在那里有错误

var createViewProperties=函数(){
返回{
rightContentVisibility:ko.observable(true)//通常为false,测试为true
};
};
风险值数据=[
{
标题:“你有兴趣帮助别人吗?”,
viewProperties:新建createViewProperties(),
},
{
标题:“这是第二种模式视图”,
viewProperties:新建createViewProperties(),
}
];
应用绑定({currentView:data})

您的代码不起作用的原因是,您正在使用
new
关键字调用
createViewProperties
。在JavaScript中的方法调用之前使用
new
,将
this
的上下文设置为当前函数,并从该函数隐式返回
this
。从对
createViewProperties
的调用中删除
new
,一切都应该正常

var data = [
 {
    headline: "Are you interested in helping others?",
    viewProperties: createViewProperties(),
 },
 {
    headline: "This is a second modal view",
    viewProperties: createViewProperties(),
 }
];
编辑

或者,您可以像这样使用
new

var createViewProperties = function () {
       this.rightContentVisibility = ko.observable(true);       
};
然后按照你一直以来的方式重新开始。注意,惯例是在JavaScript中使用大写字符作为方法名,方法名用
new
关键字调用。“构造函数”方法的名称在面向对象语言中通常也是一个名词。所以更好的办法是

var ViewProperties = function() { /* etc etc */ };

也就是说,像现在这样返回匿名对象没有什么错。

您的代码不起作用的原因是您正在使用
new
关键字调用
createViewProperties
。在JavaScript中的方法调用之前使用
new
,将
this
的上下文设置为当前函数,并从该函数隐式返回
this
。从对
createViewProperties
的调用中删除
new
,一切都应该正常

var data = [
 {
    headline: "Are you interested in helping others?",
    viewProperties: createViewProperties(),
 },
 {
    headline: "This is a second modal view",
    viewProperties: createViewProperties(),
 }
];
编辑

或者,您可以像这样使用
new

var createViewProperties = function () {
       this.rightContentVisibility = ko.observable(true);       
};
然后按照你一直以来的方式重新开始。注意,惯例是在JavaScript中使用大写字符作为方法名,方法名用
new
关键字调用。“构造函数”方法的名称在面向对象语言中通常也是一个名词。所以更好的办法是

var ViewProperties = function() { /* etc etc */ };
也就是说,像您现在这样返回匿名对象没有什么错