Knockoutjs-带有动态变量的模板
Knockoutjs - Template with dynamic variables
我正在学习javascript和ko,这是通过尝试我最喜欢的桌面rpg的字符表来实现的。由于这是第三天,我甚至不确定我是否正确地处理了这个问题,但下面是我制作技能表格的尝试。它不会产生错误,但也没有任何功能。
evals是我试图产生对其他可观测值/计算可观测值的引用,但没有运气。eval的$data部分是后来添加的关于如何更正问题的建议的解释。
<script type="text/html" id="skills-template">
<div data-bind="template: { name: 'skills-template', foreach: skills }"></div>
<div class="row">
<div class="col-md-1" data-bind="text: skill"></div>
<div class="col-md-1"><strong data-bind="text: eval('$data.' + skill + 'Total')"></strong></div>
<div class="col-md-1"><input size="2" data-bind="textInput: eval('$data.' + skill + 'Ranks')" /></div>
<div class="col-md-1"><strong data-bind="text: eval('$data.' + skillMod)"></strong></div>
<div class="col-md-1"><input size="2" data-bind="textInput: eval('$data.' + skill + 'Mod')" /></div>
<div class="col-md-1"><strong data-bind="text: untrained"></strong></div>
<div class="col-md-1"><strong> </strong></div>
<div class="col-md-1"><strong> </strong></div>
<div class="col-md-4"> </div>
</div>
</script>
作为参考,这是我创建的技能对象。
self.skills = [
{ skill: 'Acrobatics', skillMod: 'dexMod', untrained: 'Yes', acPenalty: 'Yes' },
{ skill: 'Appraise', skillMod: 'Dex', untrained: 'Yes', acPenalty: 'No' },
{ skill: 'Bluff', skillMod: 'Dex', untrained: 'Yes', acPenalty: 'No' },
{ skill: 'Climb', skillMod: 'Dex', untrained: 'Yes', acPenalty: 'Yes' },
{ skill: 'Craft', skillMod: 'Dex', untrained: 'Yes', acPenalty: 'No' },
{ skill: 'Diplomacy', skillMod: 'Dex', untrained: 'Yes', acPenalty: 'No' }
]
这是我尝试过的一个计算可观测的例子。
self.AcrobaticsTotal = ko.computed(function() {
return Number(self.AcrobaticsRanks()) + Number(self.dexMod()) + Number(self.AcrobaticsMod()) + Number(self.AcrobaticsTrained());
}, this);
如果我手工编写代码,我可以让这一切都发挥作用,但我想我会做得很聪明,避免键入所有40种技能和所有相关的可观测值。谢谢你的建议。
edit:我本应该更清楚一点,我正试图使数据绑定与我声明的其他可观测值等效。我希望eval($data.'+skill+'Total')是acrobicsTotal,并对acrobicsTotal进行ko操作。
与其在数据绑定中使用eval()。。。只需使用一个函数。传入你想要调用的技能和后缀,然后调用它作为一个类似的计算:
self.totalFor = function(skill, postfix) {
var func = skill + postfix;
// This will call the computed for the interpolated arguments
return self[func]();
}
下面是一个工作示例:http://jsfiddle.net/bryanray/ugfggo1r/4/
更新
添加了一个文本框,允许您更改"杂技"值。然后,文本框将显示更新后的值。希望能有所帮助。
已更新以修复丢失可观测值的绑定错误。谢谢你指出。
相关文章:
- 将变量动态添加到每个控制器的作用域
- 如何合并代码|使变量动态
- 如何将选择复选框值动态传递给 ajax 调用变量动态发布到 php 变量
- 如何根据javascript变量动态更改Facebook评论插件URL
- 如何通过变量动态设置一个国家的颜色
- 如何使用 React.createElement 基于 prop 或变量动态创建组件
- Angularjs基于存储在会话存储中并存储在$scope上的变量动态显示/隐藏元素
- 如何在JavaScript中使用变量动态访问对象属性
- 在ASP.NET MVC3剃刀上使用javascript变量动态创建html操作链接
- 将变量动态添加到URL
- 通过cookie变量动态更改HTML元素
- 给对象赋值.变量动态形成
- 如何使用变量动态构建正则表达式对象
- AngularJS如何用变量动态更新部分作用域
- 将变量动态分配给jquery自动完成查询字符串
- 用户和来宾使用两个不同的模板?或者使用客户端变量动态更改视图
- 根据传递的变量动态添加子字段名
- PHP回显在Javascript变量动态更改饼图图
- 为未定义的变量动态赋值
- 使用相同的划分和变量动态创建谷歌地图