2

나는 작동하지 않는 아주 간단한 예가 있습니다.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를 사용하려면 속성을 사용하여 관찰 가능한 Name 속성이있는 모든 객체에서이 함수를 호출 할 수 있습니다.

코드 설명 : 이것은 knockout.js와 함께 revealing-module-pattern을 사용하여 수행됩니다. Name 속성은 ko.observable()이므로 -가 필요합니다.

질문 : x가 정의되지 않은 이유는 무엇입니까?

답변

3

내가 물어 보겠다. x가 정의 된 곳은 어디입니까?

getName을 호출하고 Customer를 전달하지만 getName은 매개 변수를 필요로하지 않습니다. 이 같은 함수를 다시 작성하는 경우

이 작동합니다

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

이제 알았습니다. 탱크를. 모자를 ko.computed 함수를 일종의 참조로 사용할 수 있다고 생각했습니다. Ok는 Name 속성이 이미 ko.observable 함수이므로 ko.computed -> 결과가 필요하지 않습니다. http://jsfiddle.net/ThomasDeutsch/8hzhp/6/ –

+0

이제 observable을 반환하기 때문에 다음과 같이 제거 할 수도 있습니다. the() 그리고 그냥 :'return x.Name;'. 텍스트 바인딩은 관찰 대상을 다루는 방법을 알고 있습니다. –

+0

예. 그게 다야. –

1

을 당신은 관찰 "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); 
    } 
}); 

(하지에 가장 적합한 예를하지만 당신이하지 않기 때문이다 여기 계산 된 관찰이 필요합니다)