2014-10-17 72 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");