【问题标题】:Accessing property of observable object inside observable array - knockout.js访问可观察数组中可观察对象的属性 - knockout.js
【发布时间】:2014-09-22 17:45:31
【问题描述】:

一直在学习淘汰赛并获得乐趣,但我被困在我认为非常简单的事情上:访问可观察数组中可观察对象的属性。 我需要从 activeCompMultipliers 数组中的 activeCompMultiplier 对象中获取“multiplierValue”。

这是我所有的相关代码:

首先,创建并推入数组的对象。这就是我想与之交谈的内容:

var activeCompMultiplier = function (multiplierValue) {
    this.multiplierValue = ko.observable(multiplierValue);
}

这是包含可观察对象的可观察数组:

self.activeCompMultipliers = ko.observableArray();

这是创建一个新对象并将其推入数组的行:

self.activeCompMultipliers.push(new activeCompMultiplier(1));

最后,当输入字段触发“更改”事件时,这就是所谓的。我正在使用 alert() 来调试问题:

self.inputChanged = function (rowIndex) {

    alert("Multiplier is: " + self.activeCompMultipliers()[rowIndex].multiplierValue() + "\n At index: " + rowIndex);
}

这里是我的相关 HTML:

<tbody data-bind="foreach: activeParts">
                <tr>
                    <td class="ShoppingEntry" data-bind="text: $data"></td>
                    <td class="Textbox" >
                        <input type="number" class="TextBoxInput"
                          data-bind="value: $root.activeCompMultipliers()[$index()], 
                                     event: { change: inputChanged.bind(self, $index())},
                                     attr: {id: 'Textbox' + $index()}" /></td>     
                    <td class="DeleteCell">
                        <input type="image" src="/Assets/list_remove.png" class="DeleteButtonInput" data-bind="click: deactivatePart"/></td>
                </tr>
</tbody>

我认为这是一个语法问题,因为 JS 不是我最擅长的语言,但我已经使用括号进行了三次检查以解开 KO 可观察对象,所以这可能是一个范围问题?

我所有的 JS 都在 function ViewModel() {...} 函数中,然后通过 ko.applyBindings(new ViewModel()); 绑定

作为一个长期潜伏者,我感谢任何帮助。 :)

【问题讨论】:

    标签: javascript html knockout.js


    【解决方案1】:

    3 分:

    1. 你不是在循环activeCompMultipliers,而是使用activeParts$index()来访问它,这是否意味着这两个数组具有相同的大小并且是链接的?

    2. 如果index() 正确,则该值绑定到activeCompMultiplier 实例,它应该绑定到其multiplierValue 字段:

      <input type="number" class="TextBoxInput"
          data-bind="value: $root.activeCompMultipliers()[$index()].multiplierValue,
      
    3. 更改事件绑定到inputChanged,您将其范围更改为self,但此时self 是什么?并且它没有用,因为该函数已经引用了正确的self。应该是:

      event: { change: function() { inputChanged($index()); } }
      

      或至少:

      event: { change: inputChanged.bind(null, $index()) }
      

    【讨论】:

    • 谢谢@manji。对您的观点:1)是的,这些数组的大小相同并且链接了 2)没错,不知道为什么我错过了……但是添加 .multiplierValue 会导致我的 HTML 变得混乱 3)结束前的分号是 -支架有必要吗?这似乎会导致问题。
    • 我想我会在不使用 observable 的情况下尝试不同的路线,因为无论如何这可能有点过头了。我将在调用 inputChanged 进行计算时获取传入的值。
    • 是的,打错了,bind 的例子不需要分号。
    猜你喜欢
    • 2019-09-09
    • 2017-06-16
    • 2012-04-20
    • 2018-11-26
    • 2015-10-05
    • 2014-10-23
    • 2016-01-21
    • 2019-12-16
    • 2015-08-11
    相关资源
    最近更新 更多