Javascript 敲除绑定到普通JS业务层
我用TypeScript开发了一个库,它执行安装互联网宇宙飞船所需的计算。到目前为止,该库本身表现得非常出色,但我很难将其连接到交互式HTML UI。我现在正试图让它与Knockout一起工作,但如果它能使这个特定任务更容易,我愿意使用另一个框架 我遇到的具体问题是如何绑定到普通JS函数结果。初始页面以适当的初始值完美呈现,但当我在业务对象上更改单独的相关字段时,绑定值不会更新 通过阅读本文,解决这一问题的方法似乎是:Javascript 敲除绑定到普通JS业务层,javascript,knockout.js,typescript,Javascript,Knockout.js,Typescript,我用TypeScript开发了一个库,它执行安装互联网宇宙飞船所需的计算。到目前为止,该库本身表现得非常出色,但我很难将其连接到交互式HTML UI。我现在正试图让它与Knockout一起工作,但如果它能使这个特定任务更容易,我愿意使用另一个框架 我遇到的具体问题是如何绑定到普通JS函数结果。初始页面以适当的初始值完美呈现,但当我在业务对象上更改单独的相关字段时,绑定值不会更新 通过阅读本文,解决这一问题的方法似乎是: 让库保持原样,并开发一个具有剔除观测值的viewmodel,以便在计算值时调
var myViewModel = {
ship: ko.observable(theShip),
seq: ko.observable(1)
};
myViewModel.refreshAll = function () {
myViewModel.seq(this.seq() + 1);
};
myViewModel.shipStructureHP = ko.computed(function () { var x = this.refreshAll(); return theShip.structureHP(); }, myViewModel);
var myCode = {};
myCode.setSkills = function (theSkillLevel) {
myViewModel.ship().pilot.skills.SetAllSkills(theSkillLevel);
myViewModel.refreshAll();
}
在上面的示例中,shipStructureHP()ko.computed函数调用RefreshAll方法,Knockout知道该方法使用“Seq”可观测值。这意味着knockout会将shipStructureHP()记录为依赖于Seq,因此每当我增加Seq时,绑定到shipStructureHP()的元素都应该重新呈现
这感觉像是一个重大的黑客,所以我无法想象我在这里做的是正确的事情(不管它在哪里多次调用刷新)
我不需要支持传统浏览器,所以如果将函数转换为ES5属性会有所帮助,我可以这样做。我愿意接受任何关于如何让Knockout(或类似的库)来进行数据绑定的建议,同时将我的业务库保留为纯JS。有没有比我的假依赖想法更好的方法?最好是不需要在UI中复制大部分业务库就可以得到一个可绑定的viewmodel
谢谢。请澄清,您是否试图在用户界面可观察到的变化时更新JS业务模型;当业务模型发生变化时更新用户界面观察值,或者两者都发生变化?如果这只是你需要担心的第一件事,那也不算太糟。但是,是的,让你的ko观测值去“观测”非观测值是很困难的。它在整个模型中都是不同的。互联网宇宙飞船可以在不同的插槽中添加或删除不同的模块,驾驶飞船的飞行员可以在不同领域拥有不同的技能水平。这些东西需要与UI进行“双向绑定”,但这不是棘手的部分。“我将加力燃烧室安装在这艘飞船的安装槽中,因此阵列中的这个元素将发生变化,因此它包含了该模块的ID”这一说法基本上是直截了当的。我想问的部分是“如何让船上的最大速度(一个简单的JS函数)知道如何重新计算自身?”您是否考虑过使用observable.subscribe?谢谢您的建议。我只研究了knockout.mapping、knockout.viewmodel和knockout.wrap。这些似乎都不能解决我的问题。我找到了一个可行的Angular解决方案,我将进一步探索。你看过淘汰es5插件了吗?