มีข้อดีสองสามข้อในการใช้ฟังก์ชันเพื่อกำหนดโมเดลมุมมองของคุณ
ข้อได้เปรียบหลักคือคุณสามารถเข้าถึงคุณค่า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
โดยตรงในการคำนวณที่สังเกตได้ แต่จะได้รับการประเมินทันที (โดยค่าเริ่มต้น) ดังนั้นคุณจึงไม่สามารถกำหนดได้ภายในวัตถุตามตัวอักษรตามที่viewModel
ไม่ได้กำหนดไว้จนกว่าจะปิดวัตถุตามตัวอักษร หลายคนไม่ชอบที่การสร้างโมเดลมุมมองของคุณนั้นไม่ได้ถูกห่อหุ้มด้วยการโทรครั้งเดียว
รูปแบบอื่นที่คุณสามารถใช้เพื่อให้แน่ใจว่าthis
เหมาะสมเสมอคือการตั้งค่าตัวแปรในฟังก์ชันเท่ากับค่าที่เหมาะสมthis
และใช้แทน จะเป็นเช่นนี้:
var ViewModel = function() {
var self = this;
this.items = ko.observableArray();
this.removeItem = function(item) {
self.items.remove(item);
}
};
ตอนนี้ถ้าคุณอยู่ในขอบเขตของแต่ละรายการและการโทร$root.removeItem
ค่าของthis
จริงจะเป็นข้อมูลที่ถูกผูกไว้ที่ระดับนั้น (ซึ่งจะเป็นรายการ) โดยใช้ตัวเองในกรณีนี้คุณสามารถมั่นใจได้ว่าจะถูกลบออกจากรูปแบบมุมมองโดยรวม
ตัวเลือกอื่นกำลังใช้bind
งานซึ่งรองรับโดยเบราว์เซอร์ที่ทันสมัยและเพิ่มโดย KO หากไม่รองรับ ในกรณีนั้นจะมีลักษณะดังนี้:
var ViewModel = function() {
this.items = ko.observableArray();
this.removeItem = function(item) {
this.items.remove(item);
}.bind(this);
};
มีอีกมากมายที่สามารถพูดได้ในหัวข้อนี้และรูปแบบมากมายที่คุณสามารถสำรวจได้ (เช่นรูปแบบของโมดูลและรูปแบบของโมดูลที่เปิดเผย) แต่โดยทั่วไปแล้วการใช้ฟังก์ชั่นจะช่วยให้คุณมีความยืดหยุ่นมากขึ้นและควบคุมวิธีสร้างวัตถุและความสามารถในการอ้างอิง ตัวแปรที่เป็นส่วนตัวของอินสแตนซ์
prototype
(วิธีการที่มักจะดึงข้อมูลจากเซิร์ฟเวอร์และปรับปรุงรูปแบบมุมมองตามลำดับ) อย่างไรก็ตามคุณสามารถประกาศได้อย่างชัดเจนว่าพวกเขาเป็นคุณสมบัติของวัตถุตามตัวอักษรดังนั้นฉันไม่เห็นความแตกต่าง