Knockout.js를 사용하여 웹 사이트를 개발하고 있지만 제 질문은 일반적인 방식이므로 초점을 맞추지 마십시오."간접"자체 참조를 변경하거나 리디렉션 할 수있는 방법이 있습니까?
나는과 같이,이 경우 viewModel
에, 그 변수 이름 자체 내에서 객체를 참조 :이 하위 개체 및 기타에 관해서
var viewModel = {
propA: "propA",
fnA: function() {
alert("I am " + viewModel.propA); //the same as this.propA
}
};
그런 식으로, 나는 어떤 문제로 실행되지 않습니다 "멋진"물건.
지금, 나는 나의 뷰 모델에 다른 객체를 병합해야,하지만 난 참조 문제로 실행 :
g_test = {}; //The way with this global variable is just for demonstration purposes
(function() {
var viewModel = {
propA: "propA",
fnA: function() {
alert("I am " + viewModel.propB);
}
};
g_test.vmA = viewModel;
})();
(function() {
var viewModel = {
propB: "propB",
fnB: function() {
alert("I am " + viewModel.propA);
}
}
/** merge viewModel "A" into viewModel "B" */
var vmA = g_test.vmA;
for (var key in vmA) {
if (vmA.hasOwnProperty(key)) {
viewModel[key] = vmA[key];
}
}
viewModel.fnA(); //I am undefined
viewModel.fnB(); //I am propA
})();
당신이 볼 수 있듯이이 fnB
가 propA
을 알고 있지만 fnA
는 propB
를 알 수 없습니다.
viewModel
개체에 대한 참조로 this
을 사용하면 작업이 수행됩니다. 그러나 나는 모든 객체를 돌보지 않고 모든 viewModel
을 this
으로 대체하거나 필요한 경우 각각의 "도우미 변수"를 소개합니다. 이는 나이가 들기 때문에 필요합니다. 게다가, 내 눈에는 양방향 지식이없는 두 객체를 병합하는 것이 불가능하다는 것을 의미합니다.
viewModel
변수에서 fnA
의 변수가 viewModel "B"를 알지 않고도 viewModel "B"를 가리키는 지 감각적 인 방법이 있습니까?
자바 스크립트는 어휘 범위를 가지고있다. 'fnA'에서'viewModel'을 변경하는 유일한 방법은 새로운 값을 할당하는 것입니다. 그러나 그것은'viewModel'이 IIFE에 국한되기 때문에 당신의 예제에서는 불가능합니다. –
'viewModel.propB'를'this.propB'로 대체하면 작동합니다. – Jag
'this'가 대답입니다. 그것이 그곳에있는 이유. –