2014-10-03 77 views
0

請到通過鏈接:http://jsfiddle.net/nn0mfe48/1/Knockout:如何將模型傳遞給JavaScript對象字面值?

在這裏,我能夠使用淘汰賽WITH當我使用對象文字的綁定,但是當我改變它的功能相同的代碼無法正常工作。

作品:

var profileModel = { 
    first: ko.observable("Bob"), 
    last: ko.observable("Smith"), 
}; 

不起作用:

var profileModel = function() { 
    this.firstname= ko.observable("Bob"); 
    last: ko.observable("Smith"); 
}; 

什麼我需要在代碼更改,使其工作。 我需要的小時是將knockout viewmodel對象傳遞給viewmodel並動態綁定值而不是硬編碼值。

我已經通過鏈接了:Difference between knockout View Models declared as object literals vs functions

但不明白怎麼能利用我的情況。希望我解釋清楚,可以理解。在這方面的任何幫助表示讚賞。提前感謝。

+0

Javascript 101 ...這與淘汰賽無關。首先學習JavaScript語法。 – 2014-10-04 04:59:12

回答

2

您的問題中的代碼是混合對象文字語法w /變量賦值語法。此外,在該功能中,您應該將this分配給self/that變量以緩解範圍問題。這也使得使用ko.computed()好很多。結合之前

var profileModel = function() { 
    this.firstname = ko.observable("Bob"); 
    this.lastname = ko.observable("Smith"); 
}; 

確保您創建一個新實例它

var profileMod = function() { 
    var self = this; 
    self.first = ko.observable("Bob"); 
    self.last = ko.observable("Smith"); 
    } 

我已經更新了你的提琴http://jsfiddle.net/nn0mfe48/3/

+0

謝謝Stephen,它工作。 :),但在控制檯中出現如下錯誤:referenceError:Unable to process binding「with:function(){return shell}」 消息:無法處理綁定「:function(){return $ root.profile}」。即使在這個錯誤之後,它也會綁定數據。 – ravibhat 2014-10-03 19:58:37

+0

這是因爲我在我的定義中忽略了選定的選項。 http://jsfiddle.net/nn0mfe48/4/ – Stephen 2014-10-03 20:04:01

+0

雅,回覆後發現它。感謝隊友,感謝您的即時回覆。 – ravibhat 2014-10-03 20:08:39

1

一旦你創建你的觀點正確的模型

var vm = new profileModel(); 

and bind

ko.applyBindings(vm); 

另外,要小心你使用with結合的。您已在shell模型的周圍創建了一個上下文,這會迫使您使用$root訪問您的profile視圖模型。

+0

謝謝隊友。 :) – ravibhat 2014-10-03 20:03:57

+0

不客氣。可以說,儘管如此,所有模型都應該以這種方式構建,而不是作爲對象文字。您可以編寫或彙總所需的所有模型,但應該一致地定義它們。如果你希望事件冒泡,你也可以在'ko.observable'中包裝其他模型的實例(例如'this.profile = ko.observable(new profileModel());')。 – 2014-10-03 20:09:00