2013-02-26 82 views
2

我剛剛開始了一個新的Hot Towel SPA項目,我無法與ViewModel中的knockout進行綁定。在熱毛巾應用程序中使用Knockout可以進行綁定

我的視圖模型是這樣的:

define([ 
    "services/logger", 
    "knockout" 
], 
function (logger, ko) { 
    var title = ko.observable("Partners"); 


    return { 
     title: title, 
     activate: function() { 
      var that = this; 
      logger.log("Partners view activated", null, "admin.partners", false); 

      return true; 
     } 
    }; 
}); 

的看法是這樣的:

<section class="row-fluid"> 
    <div class="span10" id="admin-content"> 
     <h2 class="page-title" data-bind="text: title"></h2> 
    </div> 
</section> 

但冠軍最終總是被當作垃圾(函數即代碼,使用時像調試器:FUNCTION D(){IF(0 < ARGUMENTS.LENGTH)[...])

如果我改變綁定到「data-bind =」text:title()「,它的工作,但我意識到這並不是綁定可觀察的,只有值。因此,當使用這樣的綁定來完成表單時,它不會更新可觀察對象,並且我無法保存該值。

我發現的例子似乎使用與我完全相同的代碼,但我不明白爲什麼它不起作用。

+1

我剛剛證實,做一個ko.applyBindings({test:ko.observable('test')},$(「#test」)[0]);在沒有括號的情況下與綁定一起工作,所以它看起來確實與Durandal有關。 – 2013-02-26 15:57:39

+0

你在哪裏添加'ko.applyBindings(...)'語句?它是否在'activate'函數下的[viewmodel] .js中? – Blaise 2013-03-06 20:54:41

+0

Blaise,看到解決我的問題的這個問題的答案。 – 2013-03-07 23:31:50

回答

4

基督徒 - 你自己想清楚了。我會詳細說明。

查看App_Start/bundleconfig.cs中定義的供應商捆綁包,然後查看index.cshtml(〜第29行)底部附近的腳本加載情況。

您會看到所有的第三方腳本 - 包括挖空腳本 - 在需求之前被加載在一起。這意味着沒有任何第三方腳本可以檢測即將使用的require。因此,它們將自己加載到全局名稱空間(窗口)中。

當RequireJS出現時,它也不知道任何這些服務。因此,當您要求'ko'作爲依賴項時,它會返回null ...正如您可以看到的那樣,如果您在函數開始處放置了斷點。

所有這些都是由設計

您可以將這些服務填充到需求的IoC容器中。如果你這樣做了,require會發現'ko'並且你的函數可以工作。你可以開始瞭解這個here。我已經完成了。這不是太糟糕。

但是我們中有些人在這些水域中游泳了一段時間,已經認定它太多了PITA。所以我們按照Durandal的簡化建議:「負荷的要求,讓他們亂丟全局命名空間之外的幾個第三方庫;您更大量的應用程序文件應該生活中需要。」

這並不難,否則選擇。只需學會在你的main.js中加入要求,你就可以開始工作。

+0

標記爲答案,因爲它更簡潔,並提出填充選項。我個人去亂拋垃圾的全球命名空間,我很滿意。 – 2013-02-28 19:13:51

0

你可以嘗試這樣的事:

define([ 
    "services/logger", 
    "knockout" 
], 
function (logger, ko) { 
    var title = "Partners"; 


    return { 
     title: ko.observable(title), 
     activate: function() { 
      var that = this; 
      logger.log("Partners view activated", null, "admin.partners", false); 

      return true; 
     } 
    }; 
}); 
+0

同樣的問題。我成功地向ViewModel添加了一個「setView」方法,並手動應用綁定,但似乎只適用於observables而不是可觀察數組。 – 2013-02-26 16:13:17

3

發現問題的幫助從迪朗達爾開發商在這裏:https://groups.google.com/forum/#!topic/durandaljs/Ku1gwuvqPQQ

看來,採用AMD包括淘汰賽是問題。我不知道具體細節,但可能與Durandal使用全局ko變量有關,而我的視圖模型使用ko變量,這是不同的,因爲RequireJS創建了它自己的實例。

相關問題