객체 리터럴과 함수로 선언 된 녹아웃 뷰 모델의 차이점
녹아웃 js에서 View Models가 다음 중 하나로 선언 된 것을 볼 수 있습니다.
var viewModel = {
firstname: ko.observable("Bob")
};
ko.applyBindings(viewModel );
또는:
var viewModel = function() {
this.firstname= ko.observable("Bob");
};
ko.applyBindings(new viewModel ());
둘 사이의 차이점은 무엇입니까?
knockoutjs Google 그룹 에서이 토론 을 찾았 지만 실제로 만족스러운 답변을주지 못했습니다.
예를 들어 다음과 같은 데이터를 사용하여 모델을 초기화하려는 이유를 알 수 있습니다.
var viewModel = function(person) {
this.firstname= ko.observable(person.firstname);
};
var person = ... ;
ko.applyBindings(new viewModel(person));
그러나 내가 그렇게하지 않으면 내가 선택한 스타일이 중요합니까?
함수를 사용하여 뷰 모델을 정의하면 몇 가지 장점이 있습니다.
주요 이점은 this
생성중인 인스턴스와 동일한 값에 즉시 액세스 할 수 있다는 것입니다. 이것은 당신이 할 수 있음을 의미합니다 :
var ViewModel = function(first, last) {
this.first = ko.observable(first);
this.last = ko.observable(last);
this.full = ko.computed(function() {
return this.first() + " " + this.last();
}, this);
};
따라서 계산 된 옵저버 블은 this
다른 범위에서 호출 된 경우에도 의 적절한 값에 바인딩 될 수 있습니다 .
객체 리터럴을 사용하면 다음을 수행해야합니다.
var viewModel = {
first: ko.observable("Bob"),
last: ko.observable("Smith"),
};
viewModel.full = ko.computed(function() {
return this.first() + " " + this.last();
}, viewModel);
이 경우 viewModel
계산 된 Observable에서 직접 사용할 수 있지만 즉시 (기본적으로) 평가되므로 viewModel
개체 리터럴을 닫을 때까지 정의되지 않은 것처럼 개체 리터럴 내에 정의 할 수 없습니다 . 많은 사람들이 뷰 모델 생성이 한 번의 호출로 캡슐화되는 것을 좋아하지 않습니다.
this
항상 적절한 지 확인하기 위해 사용할 수있는 또 다른 패턴 은 함수의 변수를 적절한 값과 동일하게 설정 this
하고 대신 사용하는 것입니다. 이것은 다음과 같습니다
var ViewModel = function() {
var self = this;
this.items = ko.observableArray();
this.removeItem = function(item) {
self.items.remove(item);
}
};
이제 개별 항목의 범위에 있고를 호출 $root.removeItem
하면의 값 this
은 실제로 해당 수준에서 바인딩되는 데이터 (항목)가됩니다. 이 경우 self를 사용하면 전체 뷰 모델에서 제거 될 수 있습니다.
다른 옵션은 bind
최신 브라우저에서 지원하고 지원되지 않는 경우 KO에서 추가하는을 사용하는 것입니다. 이 경우 다음과 같습니다.
var ViewModel = function() {
this.items = ko.observableArray();
this.removeItem = function(item) {
this.items.remove(item);
}.bind(this);
};
이 주제에 대해 말할 수있는 것이 더 많으며 모듈 패턴 및 모듈 패턴 표시와 같이 탐색 할 수있는 많은 패턴이 있지만 기본적으로 함수를 사용하면 객체 생성 방법 및 참조 기능에 대한 유연성과 제어력이 향상됩니다 인스턴스 전용 인 변수
비슷한 방법으로 다른 방법을 사용합니다.
var viewModel = (function () {
var obj = {};
obj.myVariable = ko.observable();
obj.myComputed = ko.computed(function () { return "hello" + obj.myVariable() });
ko.applyBindings(obj);
return obj;
})();
몇 가지 이유 :
- Not using
this
, which can confusion when used withinko.computed
s etc - My viewModel is a singleton, I don't need to create multiple instances (i.e.
new viewModel()
)
'IT story' 카테고리의 다른 글
버전 4.1 기준으로 OpenGL에서 텍스트 렌더링을위한 최첨단 기술은 무엇입니까? (0) | 2020.05.12 |
---|---|
Visual Studio에서 만든 obj 및 bin 폴더는 무엇에 사용됩니까? (0) | 2020.05.12 |
X-Requested-With 헤더의 요점은 무엇입니까? (0) | 2020.05.12 |
구문 강조를 즉시 수행 할 수있는 텍스트 영역? (0) | 2020.05.12 |
'&'를 '&'로 인코딩해야합니까? (0) | 2020.05.12 |