2015-06-30 68 views
1

我試圖使用多個視圖模型建議in the documentationin this other answer多視圖模型breakout.js

我得到一個錯誤在控制檯抱怨沒有被定義的變量:

Uncaught ReferenceError: Unable to process binding "foreach: function(){return seals }" Message: seals is not defined

Reproduction online

HTML

<!-- ko foreach: seals --> 
<div class="form-group"> 
    <label for="seal" class="col-xs-2 control-label" data-bind="text: 'Seal ' + name"></label> 
    <div class="col-xs-8"> 
     <input type="text" class="form-control" data-bind="attr: {name: 'seal' + formName}" /> 
    </div> 
</div> 
<!-- /ko --> 

JS

ko.applyBindings(demo, document.body); 
ko.applyBindings(addEquipmentModel, document.getElementById('whatever')); 

回答

2

的問題是在這裏:

ko.applyBindings(demo, document.body); 

您將模型應用於document.body,所以它會嘗試解析和整個文檔綁定。當它得到的部分用:

<!-- ko foreach: seals --> 

因爲demo模型沒有一個seals屬性你得到一個錯誤。

實際上,您不希望被綁定的元素重疊。換句話說,不要將一個模型綁定到綁定到另一個模型的元素的子元素。他們應該是兄弟姐妹,或堂兄弟。不是直系後裔。

+0

是的,我認爲是有道理的。拋開一個問題。您建議在網站上創建多少個模型?我使用不同的菜單彈出窗口,但不確定分離是否是必要的,以及它的優點。在文檔中不太清楚。 像,它是有意義的有一個頭,其他的身體和其他獨立元素? – Alvaro

+0

@Alvaro:「多長時間是一段弦?」題。答案是「視情況而定」。就個人而言,我更喜歡擁有一個包含儘可能多的子模型的模型,因爲我希望/需要/有意義,而不是嘗試將不同模型綁定到DOM的不同部分。如果稍後需要將這些部分混淆起來,則會更輕鬆。 –

+0

對我明白了。感謝它。 – Alvaro

1

如果您需要嵌套在視圖中的幾個視圖模型,或者甚至是父子關係中,則應考慮使用Knockout組件。除此之外,另一種可能性是在主視圖模型中將apply(this)用於其他視圖模型的「類」,因此您的主視圖模型會繼承所引用模型的功能和屬性。但是,如果您的視圖模型中有名稱併發,則會導致問題。