【问题标题】:Knockoutjs how to access view model from outside functionKnockoutjs 如何从外部函数访问视图模型
【发布时间】:2014-08-12 21:32:43
【问题描述】:

我在Access viewModel in javascript function outside viewModel's scope 中找到了一些与我正在尝试做的事情类似的例子,但我无法弄清楚在我的特定情况下该怎么做。我有几位老师,显示他们的薪水以及总薪水,但想显示他们薪水与总薪水的相对百分比。这是我的看法:

<table>
    <tr>
    <th></th>
    <th>Salary</th>
    <th>Salary Percent</th>
    </tr>
    <tbody data-bind="foreach: teachers">
    <tr>
        <td data-bind="text: name"></td>
        <td data-bind="text: salary"></td>
        <td data-bind="text: salaryPercent"></td>
    </tr>
    </tbody>
    <tr>
    <td>Total Salary</td>
    <td data-bind="text: totalSalary"></td>
    </tr>
</table>

查看模型:

var Teacher = function(id, name, salary) {
    this.id = id;
    this.name = name;
    this.salary = salary;
    this.salaryPercent = ko.computed(function() {
        // return accounting.toFixed((this.salary/178000)*100, 0) + '%';    // works with hard-coded total salary
        return accounting.toFixed((this.salary/viewModel.totalSalary)*100, 0) + '%';
        // return this.salary;    // works, returns the same salary as this.salary above
    }, this);
};

var viewModel = function(teachers) {
    var self = this;
    self.teachers = ko.observableArray(teachers);
    self.totalSalary = ko.computed(function() {
        var total = 0;
        ko.utils.arrayForEach(self.teachers(), function(teacher) { total += teacher.salary; });
        return total;
    });
};

var initialTeachers = [
    new Teacher(1, "Tom", 40000),
    new Teacher(2, "Betty", 41000),
    new Teacher(3, "Charles", 45000),
    new Teacher(4, "Daniel", 52000)
];

var vm = new viewModel(initialTeachers);
ko.applyBindings(vm);

和css:

td, th {
    border: solid 1px black;
    padding: 2px;
}

JSFiddle

TIA,史蒂夫

注意:我使用的是 jsfiddle 附带的 accounting.js 库。

【问题讨论】:

  • 问题出在return accounting.toFixed((this.salary/viewModel.totalSalary)*100, 0) + '%';这一行。 viewModel 未在当前范围内定义。

标签: knockout.js


【解决方案1】:

This JSFiddle 做你想做的事情。我在viewModelcalculateSalaryPercent 中添加了一个函数,它以薪水为参数。我从Teacher 中删除了salaryPercent,因为它现在是在更高的级别上计算的。

一个简短的说明:调用 accounting.toFixed 时使用零位小数可能会导致百分比加起来小于 100%。

【讨论】:

  • 甜蜜——这就是我想要的。我还在学习淘汰赛,并且已经开始在视图模型中放置一个函数,但不知道如何调用它。很明显,我需要阅读有关 $parent 和 $root 的信息!
  • 好!支持您花时间将其放在 JSFiddle 中。
  • 在百分比加起来不等于 100% 时,是的,这有点问题,但即使是我得到的需求文档也显示加起来为 99% 的整数。有趣的是,将精度更改为 1 可以使其加起来达到 100%,但精度为 2 则显示为 99.99%。对于这个特定的应用程序,它实际上更像是一个粗略的估计,我们正在替换一个电子表格,该电子表格已经在显示整数方面做了同样的事情。对他们来说不是问题,但感谢您指出。
【解决方案2】:

除了 gorilly 的解决方案之外,另一种方法是使用敲除的绑定上下文 $parent 直接在视图本身上构建逻辑。

但是这种解决方案对于追求“无逻辑模板”的人(不是我)来说是丑陋的。

http://jsfiddle.net/2tgqb4gg/27/

<tbody data-bind="foreach: teachers">
 <tr>
  <td data-bind="text: name"></td>
  <td data-bind="text: salary"></td>
  <td data-bind="text: accounting.toFixed(salary/$parent.totalSalary()*100,0)+'%'"></td>
 </tr>
</tbody>

【讨论】:

  • 为了记录,这很有效,非常感谢这里的额外教育。我只是还没有/还没有思考过 $parent 和 $root 是如何工作的。谢谢你。
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2013-12-06
  • 1970-01-01
  • 2017-04-11
  • 2014-11-20
相关资源
最近更新 更多