2008-11-20 32 views

Trả lời

14

Điều này khá dễ làm nếu bạn quấn tất cả vào một lớp. Chúng ta sẽ sử dụng các phương thức getter/setter. Phương thức setter sẽ gửi và event bất cứ khi nào nó được gọi.

(Lưu ý: Người định cư và Getters được coi là tài sản). Bạn chỉ gán một giá trị, như trái ngược với cách gọi một phương pháp (ví dụ someVar = 5 thay vì someVar(5); Mặc dù setters/getters được chức năng/phương pháp, họ được đối xử như các thuộc tính

//The document class 
package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 

    public Class TestDocClass extends Sprite 
    { 
    private var _model:Model; 

    public function TestDocClass():void 
    { 
     _model = new Model(); 
     _model.addEventListener(Model.VALUE_CHANGED, onModelChanged); 
    } 

    private function onModelChanged(e:Event):void 
    { 
     trace('The value changed'); 
    } 
    } 
} 

//The model that holds the data (variables, etc) and dispatches events. Save in same folder as DOC Class; 
package 
{ 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 

    public class Model extends EventDispatcher 
    { 
    public static const VALUE_CHANGED:String = 'value_changed'; 
    private var _someVar:someVarType; 

    public function Model():void 
    { 
     trace('The model was instantiated.'); 
    } 

    public function set someVariable(newVal:someVarType):void 
    { 
     _someVar = newVal; 
     this.dispatchEvent(new Event(Model.VALUE_CHANGED)); 
    } 
    } 
} 
+1

Vâng - Tôi rất thích nhìn thấy một ví dụ làm việc về điều này. Tôi đang cố gắng kết hợp một bài kiểm tra hit. Khi người dùng vượt quá một mục, có một người nghe ENTER_FRAME đăng ký giá trị "lần truy cập" không đổi, nhưng khi họ tắt, người nghe sẽ thay đổi để đăng ký giá trị "tắt" không đổi. Kịch bản này sẽ áp dụng như thế nào cho mô hình của bạn? – mheavers

1

Bạn đã từng có thể làm điều gì đó tương tự trong AS2 bằng cách sử dụng Object.watch. Tôi không thấy tương đương trực tiếp, nhưng có vẻ như mx.binding.utils.ChangeWatcher sẽ cung cấp cho bạn chức năng tương tự cho bất kỳ biến nào có thể ràng buộc được.

Tôi không biết cách làm trong AS3 cho các biến không ràng buộc được, nhưng nếu biến bạn muốn xem là có thể ràng buộc (hoặc nếu bạn có thể sửa đổi thành binadable) thì ChangeWatcher có thể cung cấp cho bạn bạn muốn.

2

@BrianHodge:. Làm thế nào để bạn thực sự sử dụng của bạn Làm thế nào để bạn gọi chức năng thiết lập? Làm thế nào để bạn tham khảo nó? Nơi nào vượt qua biến được thay đổi ..?

Hãy nói rằng nếu tôi muốn thay đổi biến bọc với một nút bấm, ví dụ. Tôi phải thú nhận rằng tôi đã thử một số mã khác và ví dụ (getter/setter) loại, với dispatchEvent hoặc không có, và tôi không thể vượt qua nó! Nhưng ví dụ của bạn dường như chính xác những gì tôi cần, không thể làm cho nó hoạt động được.

Tôi nhận được The model was instantiated khi tôi đặt chức năng làm lớp tài liệu. Đó là tất cả.

Tôi phát hiện ra, cuối cùng, đối với những người như tôi, những người đang mất thời gian với điều công văn này!
Trong trường hợp của tôi, biến số _someVar phải được nhập dữ liệu là String (cùng một điều cho fornewVal).

OnceTestDocClass được đặt làm lớp tài liệu của bạn; bạn tham khảo các mẫu instantiated như thế này:

_model.someVariable="new stuff"; 

Tôi đã cố gắng để thay đổi giá trị như thế này:

_model.someVariable("new stuff"); 

Bạn có thể thêm một số hành động dấu vết trong lớp Model để có một bản demo rõ ràng trong bảng điều khiển đầu ra:

package 
{ 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 

    public class Model extends EventDispatcher 
    { 
    public static const VALUE_CHANGED:String = 'value_changed'; 
    private var _someVar:String = "default"; 

    public function Model():void 
    { 
     trace('The model was instantiated.'); 
    } 

    public function set someVariable(newVal:String):void 
    { 
     trace ("before " + _someVar); 
     _someVar = newVal; 
     trace ("after " + _someVar); 
     this.dispatchEvent(new Event(Model.VALUE_CHANGED)); 
    } 
    } 
} 

Đó không phải là nhiều, nhưng những điều này có thể tốn một số người rất nhiều toàn bộ thời gian =)

Các vấn đề liên quan