2013-10-16 113 views
0

代码KnockoutJS observableArray未初始化

function Product(name) { 
    this.name = ko.observable(name); 
} 

function ProductViewModel() { 
    var self = this; 
    self.products = ko.observableArray(); 
    $.getJSON("/admin/test", function(allData) { 
    var mappedProducts = $.map(allData, function(item) { return new Product(item.name) }); 
    self.products(mappedProducts); 
    console.log(self.products); 
    });  
} 

ko.applyBindings(new ProductViewModel()); 

问题:同时allDatamappedProducts正确设置(只是产品具有名称和其他一些字段的数组),线路console.log(self.products);正在打印一个空数组。

我真的很困惑,我在第一个方法与KO,但这似乎是从教程非常相同的代码...即时通讯只是使用产品,而不是任务。我确定我错过了一些愚蠢的东西。

回答

2

应登录的东西可观察到的,而不是观察到的本身:

console.log(self.products()); 

与它的代码演示见this fiddle

在问题的情况下,它取决于浏览器会记录什么。诚然,有点混乱:

[]

好像一个空数组。 的Internet Explorer 10更有意义,输出:

function c(){if(0<arguments.length)return c.equalityComparer&&c.equalityComparer(d,arguments[0])||(c.K(),d=arguments[0],c.J()),this;a.q.bb(c);return d}

即:一个事实,即self.products事实上是一个函数(可观察到的)。 火狐是在两者之间,输出:

c()

没有太大的用处作为IE10,但不作为乱如Chrome浏览器无论是。

1

这是用于设置可观察:

self.products(mappedProducts) 

而这是为获得一observbale的值或计算

var mappedProducts = self.products(); 

通知的括号。

我希望它有帮助。