如何从Knockout函数中获取值

时间:2014-03-14 00:09:50

标签: javascript html knockout.js

我正在使用Knockout并且我正在尝试构建将返回值的函数,问题是我正在计算内部函数内部的值,而我找不到从中获取值的方法这个功能。

这就是我到目前为止所拥有的

JS

var vm = {
    myResponse: ko.observable(),
    computedValue: ko.observable()
};

vm.myResponse.subscribe(function (newValue) {
    myfunction(computedValue);
});


var myfunction = function (observableToUpdate) {
    var responses = request.responses();
    return changeUp.getUserInfo().then(function (userInfo) {
        var currentResponse = ko.utils.arrayFirst(responses, function (r) {
            return r.userName === userInfo.userName;
        });
        var responseindex = responses.indexOf(currentResponse);
        observableToUpdate({
            responeIndex: responseindex
        });
    });
};

在我的HTML上,我正在使用以下行

<tbody data-bind="foreach: request.responses()">
<tr data-bind="css: { responder : $parent.vm}">
    <td>{{since()}}</td>
    <td>{{amount|number}}</td>
    <td>{{rate|number}}</td>
    <td>{{distance}}</td>
    <td>
        <a data-bind="click: action">{{_t('Details')}}</a>
</tr>
</tbody>

目前没有得到类响应者。我想只在isMyResponse中的条件为真时添加它;

2 个答案:

答案 0 :(得分:1)

使用异步回调来设置observable的唯一方法是使用订阅。敲出计算需要一个同步返回值。

在“then”回调之前,您已完成执行。

var someObservable = ko.observable();
var computedValue = ko.observable();

someObservable.subscribe( function( newValue ) {
    changeup.getUserInfo().then( function(userInfo) {
        ...
        computedValue(myRespondIndex);
    });
} );

此外,“then”回调返回值仅影响promise的调用链。如果抛出异常,将触发失败回调,并且不会调用任何链接的“then”回调。返回的值不会通过回调“级联”。

答案 1 :(得分:0)

对于UserID = 'undefined',我认为第一个then函数的结果将传递给第二个then函数。第二个then函数的结果将是undefined,因为没有返回任何内容。我认为应该是这样的: -

this.isMyResponse = function(index) {
    var test ;
    var responses = this.request.responses();
    var useriD = changeup.getUserInfo().then(function (userInfo) {
        var currentResponse = ko.utils.arrayFirst(responses, function (r) {
            return r.username === userInfo.username;
        });
        var myRespondIndex = responses.indexOf(currentResponse);
        test = myRespondIndex;
        console.log("inside" + test);
        return myRespondIndex;
    }).then  (function (index) {
        console.log("outside" + test);
        return index;
    });
    console.log("outside" + test);
    return test;
}

修改
以下jsFiddle是我试图证实罗伯特·斯坦利告诉我的内容。最后,我实施了他的建议解决方案。

http://jsfiddle.net/gonefishern/zdDh9/

正如罗伯特·斯坦利向我指出的那样,以下javascript将返回一个承诺,但不是我认为的价值观。

var isMyResponse = function(observableToUpdate) {
    var responses = this.request.responses();
    return  changeup.getUserInfo().then(function (userInfo) {
        var currentResponse = ko.utils.arrayFirst(responses, function (r) {
            return r.username === userInfo.username;
         });
         return {
             responeIndex: responses.indexOf(currentResponse),
             userInfo: userInfo
         };
    });
}