knockout javascript 函数从数组中读取

knockout javascript function to read from an array

我是 knockout 的新手,我正在尝试创建一个可以在我的视图中绑定的函数,以便将不同的输入框绑定到数组的不同元素。

不幸的是,在 knockout 中调用函数的代码似乎发生在填充数组之前。我确信有一些简单的方法可以解决这个问题,但我已经尝试了一段时间,就是想不出来

(function () {

var BankingViewModel = function () {

    //data
    var self = this;
    self.safeFloatTotal = ko.observable(null);
    self.floatRecommendedValue = ko.observable(null);

    self.safeFloatDenominations = ko.observableArray();

        //populate the array 
        var safeFloatCash = bankingApi.client.getSafeFloatCash();
        safeFloatCash.done(function (d) {
            self.safeFloatDenominations(d);
        })


    self.GetNoteByDenomination = ko.computed( function () {
      //  return 1234; //will bind OK
        return self.safeFloatDenominations[1]; //length of the array is zero when this is called, so element is undefined

    });
}

$(document).ready(function () {
    var viewModel = new BankingViewModel();        
        ko.applyBindings(viewModel);        
});

})();

并在视图中

<div class="row">
                        <div class="col-xs-6">
                            <input type="text" data-bind="value: GetNoteByDenomination" />
                            <label>£50</label>
                        </div>
                        <div class="col-xs-6">
                            <input type="text" data-bind="value: safeFloatTotal" />
                            <label>50p</label>
                        </div>
                    </div>

我需要在数组初始化后能够调用它,这是我目前卡住的地方

如果你想访问可观察数组的第二个元素,你必须执行可观察对象的函数来获取底层数组:

self.GetNoteByDenomination = ko.computed(function () {
    return self.safeFloatDenominations().length > 1 ?
           self.safeFloatDenominations()[1] : "";
});

无论数组中有多少项,执行 self.safeFloatDenominations[1] 都会 return undefined

var BankingViewModel = function(){
    var self = this;

    this.applyData = function(data){
        // map ur data response from api with the observablearray here
    };
}

$(document).ready(function(){
        var viewModel = new BankingViewModel();        
        ko.applyBindings(viewModel);   

        var safeFloatCash = bankingApi.client.getSafeFloatCash();
        safeFloatCash.done(function (d) {
             viewModel.applyData(d);
        })
});