2014-10-17 73 views
1

我正在構建一組RequireJS AMD模塊對象。我正在使用KnockoutJS來將用戶界面數據綁定到這些模塊。KnockoutJS數據綁定在RequireJS模塊上使用instanceof

我定義我的模塊:

define([ 
    "libs/knockout", 
], function(ko) { 
    MyModuleClass= function() { /* Stuff */ } 

    return MyModuleClass; 
}); 

在我看來,(HTML),我有一個數據綁定:

<span data-bind="if: (myObservable() instanceof MyModuleClass)"> 
    <!-- Stuff --> 
</span> 

的目標是展示標記時觀察到的是一個實例MyModuleClass。否則,我不想顯示該標記。

發生此問題的原因是:由於我的ViewModel正在使用RequireJS將MyModuleClass作爲範圍變量加載到ViewModel中,因此KnockoutJS綁定沒有對MyModuleClass的引用。這會導致數據綁定失敗,因爲MyModuleClass在該範圍內未定義。 MyModuleClass還具有其他從它派生的模塊,因此instanceof調用相當重要,因爲我仍然希望從MyModuleClass派生的子對象也可以傳遞此數據綁定。

有沒有任何建議乾淨地解決這個問題?我可以創建可以綁定的計算變量。那些計算出來的觀察對象可以使用instanceof邏輯,這會從數據綁定標籤中去除依賴關係。這是我迄今爲止最好的想法 - 但我不確定它是否像我希望的那樣乾淨。

任何干淨的方式來實現完全包含在數據綁定標籤內的類似功能將是我的目標。發生

+0

您對使用計算器的建議是我正在建議的。一般來說,你不希望你的邏輯在你的綁定中。綁定應該包含可觀察量或簡單表達式,但不包含「複雜」邏輯。除此之外,我強烈建議不要在JavaScript中繼承這麼多。總的來說,我認爲它有點反模式,特別是在JavaScript中,它不是基於類的語言,並且對繼承的處理方式與其他語言通常不同。爲什麼不只是添加一個屬性到你的模塊原型(這將被兒童繼承)並綁定到該模型? – 2014-10-17 14:46:37

+0

聽起來像這樣是使用計算機的方法。我看到你對JavaScript中的繼承的看法。我有很多類通過原型鏈延伸,在我的情況下,這使得代碼非常乾淨。當被理解和正確使用時,JavaScript中的繼承在我的書中完全正確。 – 2014-10-17 15:27:59

回答

1

該問題的原因:因爲我的視圖模型是用RequireJS加載MyModuleClass在我的ViewModel一個範圍變量,則KnockoutJS結合不必在MyModuleClass參考。

你正在過量使用它,這個問題與RequireJS沒有任何關係。 MyModuleClass不在binding context中,因此它不可用於綁定。將它添加到視圖模型或其他可以從綁定上下文訪問的地方,它將可用。例如,在視圖模型中:

// require and export MyModuleClass 
var MyModuleClass = this.MyModuleClasss = require("my-module-class");