击倒中的计算可观察函数

时间:2013-08-23 10:50:19

标签: javascript model-view-controller knockout.js

我的淘汰赛实施有问题。我是淘汰赛的新手,所以会很感激帮助。

我有以下代码:

    function updateViewModel() {
        if (typeof groupId == 'undefined') {
            groupId = getDefaultGroupId();
        }

        $.getJSON("api/livestatusgroup/children/" + groupId)
            .done(function (data) {
                ko.mapping.fromJS(data, liveStatusViewModel.groups);
                groupsLoaded();
            });

        $.getJSON("api/livestatusgroup/resources/" + groupId)
            .done(function(data) {
                ko.mapping.fromJS(data, liveStatusViewModel.resources);
                resourcesLoaded();
            });

        this.resourceImagePath = ko.computed(function () {
            return "../Image/" + this.ResID;
        }, this);
    }


    function ViewModel() {
        var self = this;
        self.resources = ko.mapping.fromJS([]);
        self.groups = ko.mapping.fromJS([]);
    }

    var vm = new ViewModel();
    ko.applyBindings(vm);

不幸的是,计算出的observable函数resourceImagePath没有正确捕获我的资源的ResID,所以我最终得到了像/ Image / undefined这样的URL。

我错过了什么?我已经检查过,ResID字段肯定存在于视图模型中。

S

1 个答案:

答案 0 :(得分:0)

实现ko.computed observable时,它只为在计算函数中引用的observable创建依赖项。请记住,必须通过执行它们来引用observable,因为它们是函数 - 这是允许计算函数检测和跟踪依赖关系的动作。

否则,计算函数只能使用首次执行计算函数时可用的值。

此代码引用this.ResID,但由于未将ResID视为可观察对象,因此对其没有任何依赖性。

 this.resourceImagePath = ko.computed(function () {
        return "../Image/" + this.ResID;
    }, this);

尝试确保this.ResID实际上是一个可观察的,并添加如下括号:

 this.resourceImagePath = ko.computed(function () {
        return "../Image/" + this.ResID();
    }, this);