2012-05-04 58 views
0

跟随文档,尝试我自己的并碰到一些问题。noob问题关于knockout.js和范围

initializeViewModel = function(){ 

    var listing_model = { 
     sale_rent: ko.observable(jQuery('#id_sale_rent')), 
     property_type: ko.observable(jQuery('#id_property_type').val()), 
     address: ko.observable(jQuery('#id_address')), 
     is_condo: ko.computed(function(){ 
      return this.property_type() == 'condominium'; 
     }, this) 
    }; 



    listing_model.district = ko.computed(function(){ 

     return this.district() || this.property_type(); 
    }, listing_model); 

    return listing_model; 
} 

声明return this.property_type() == 'condominium';导致异常object <object> has no method property_type()。我认为这可能是一个范围问题,但this似乎指的是这里的正确实例。有人能指出我的问题吗?

回答

2

最干净的解决方案是使用一个匿名函数(以​​创建一个封闭件),而不是一个普通的对象:

initializeViewModel = function(){ 
    var listing_model = new function() { 
     // Close-in a reference to this object 
     var self = this; 

     self.sale_rent = ko.observable(jQuery('#id_sale_rent')); 
     self.property_type = ko.observable(jQuery('#id_property_type').val()); 
     self.address = ko.observable(jQuery('#id_address')); 

     self.is_condo = ko.computed(function() { 
      return (self.property_type() == 'condominium'); 
     }); 
    }(); 

    // ... 

否则,“这个”的功能(定义所计算的)的内部是指任何你'作为第二个参数传递给ko.computed() - “this”的值存在“initializeViewModel”在其中执行的当前上下文,所以如果您像往常一样调用该函数(即initializeViewModel()),则“这个“只是对全局对象的引用,而不是对”listing_model“的引用(如预期的/预期的)。

手册中的示例与您的代码不同:您正在创建一个普通对象,而在手册中,所有内容都包含在函数中。使用“new”关键字调用该函数会创建一个新对象并将该上下文(“this”)设置为该对象。这就是他们的代码工作的原因。

+0

啊......启发。 ..谢谢@妮可。我会去尝试一下。 – goh

+0

问题..为什么我的错误消息在Chrome中不能通过这个domwindow呢? – goh

+0

对不起,您可以重新解释一下吗?你期望“这个”成为domwindow的目标吗? – Niko

0

那么this指的是匿名函数范围,其次this.property_type()是一个函数调用,你不能指定一个变量。

+0

以及我遵循文档中的说明http://knockoutjs.com/documentation/computedObservables.html它说传递这个作为参数ko.computed引用listing_model对象本身, – goh