Knockout.js: параметр функции не определен

У меня есть очень простой пример, который не работает.

jsfiddle: http://jsfiddle.net/ThomasDeutsch/8hzhp/3/

// My Model
function Customer(id, name, lastname) {
    this.Id = ko.observable(id);
    this.Name = ko.observable(name);
    this.LastName = ko.observable(lastname);
}

// My ViewModel
ViewModel = (function () {
    var getName = ko.computed(function (x) {
        return x.Name();
    });

    return {
        getName: getName(new Customer(1, "Thomas", "D"))
    };
})();

ko.applyBindings(ViewModel);​

проблема: параметр (x) не определен

цель: вернуть имя-свойство вызываемого объекта - я хочу использовать x как свойство, чтобы я мог вызывать эту функцию с любым объектом с наблюдаемым свойством имени

Объяснение кода: Это делается с использованием шаблона раскрывающего модуля с knockout.js. Свойство Name является ko.observable(), поэтому () необходимо.

вопрос: почему х не определено?

2 ответа

Решение

Позвольте мне спросить вас. Как вы думаете, где х определяется?

Вы вызываете getName и передаете Customer, но getName не ожидает параметр.

Если вы переписываете свою функцию следующим образом, она будет работать:

var getName = function(x) { return ko.computed( function() {
    return x.Name();
})};

Вы пытаетесь изменить значение наблюдаемого "getName", но так как оно вычисляется, это неопределенное поведение, пока вы не укажете, как это должно быть обработано.

Я думаю, что лучшим решением было бы представить еще одну наблюдаемую информацию, которая хранит клиента.

var ViewModel = (function() {
    // Observable for the customer
    var customer = ko.observable(new Customer(1, "Thomas", "D"));

    // The computed observable, using the other one
    var getName = ko.computed(function() {
        return customer().Name();
    });

    // If you only need to access the name, its sufficient
    // to export only that observable. However, this is still
    // read-only.
    return {
        getName: getName
    };
})();

Если вы хотите сделать его доступным для записи, вы можете определить сеттер для вычисляемой наблюдаемой:

var getName = ko.computed({
    read: function() {
        return customer().Name();
    },
    write: function(n) {
        customer().Name(n);
    }
});

(не пример, который имеет больше смысла, но это потому, что вам на самом деле не нужна вычисляемая наблюдаемая здесь)

Другие вопросы по тегам