Knockout.js KnockoutJS数据绑定在RequireJS模块上使用instanceof

Knockout.js KnockoutJS数据绑定在RequireJS模块上使用instanceof,knockout.js,requirejs,Knockout.js,Requirejs,我正在构建一组RequireJS AMD模块对象。我使用KnockoutJS将用户界面数据绑定到这些模块 我定义我的模块: define([ "libs/knockout", ], function(ko) { MyModuleClass= function() { /* Stuff */ } return MyModuleClass; }); 在我的视图(HTML)中,我有一个数据绑定: <span data-bind="if: (myObservable() in

我正在构建一组RequireJS AMD模块对象。我使用KnockoutJS将用户界面数据绑定到这些模块

我定义我的模块:

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

   return MyModuleClass;
});
在我的视图(HTML)中,我有一个数据绑定:

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

目标是在observable是MyModuleClass的实例时显示标记。否则,我不想显示该标记

出现此问题的原因是:由于我的ViewModel使用RequireJS将MyModuleClass作为范围变量加载到我的ViewModel中,KnockoutJS绑定没有对MyModuleClass的引用。这导致数据绑定失败,因为MyModuleClass在该范围内未定义。MyModuleClass还有从中派生的其他模块,因此instanceof调用相当重要,因为我仍然希望从MyModuleClass派生的子对象也传递此数据绑定

有什么建议可以干净地解决这个问题吗?我可以创建可以绑定的计算变量。这些计算出的可观测值可以使用instanceof逻辑,这将从数据绑定标记中删除依赖项。这是我迄今为止最好的主意——但我不确定它是否像我希望的那样干净

我的目标是以任何干净的方式实现完全包含在数据绑定标记中的类似功能

出现此问题的原因是:由于我的ViewModel使用RequireJS将MyModuleClass作为范围变量加载到我的ViewModel中,KnockoutJS绑定没有对MyModuleClass的引用

你想得太多了,这个问题与RequireJS无关<代码>MyModuleClass不在中,因此它不可用于绑定。将它添加到视图模型或从绑定上下文可以访问的其他位置,它将可用。例如,在视图模型中:

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

你关于使用计算机的建议正是我要建议的。通常,您不希望您的逻辑出现在绑定中。绑定应该包含可观察的或简单的表达式,但不能包含“复杂”逻辑。除此之外,我强烈建议不要在JavaScript中使用继承。一般来说,我认为它是一种反模式,尤其是在JavaScript中,它不是基于类的语言,它对待继承的方式与其他语言通常不同。为什么不向您的模块原型中添加一个属性(将由子模块继承)并绑定它呢?听起来这就是使用Computed的方法。我看到了您对JavaScript继承的看法。我有许多类通过原型链进行扩展,在我的例子中,这使得代码非常干净。在我的书中,正确理解和使用JavaScript中的继承是完全正确的。