2013-01-09 31 views
11

Có cách nào chúng ta có thể tránh chạy mã quan sát được trong một vài trường hợp không?Cách đặt thuộc tính có thể quan sát được nhưng không chạy chức năng quan sát được trong một vài trường hợp trong EmberJS

Tôi đã thử như thế nào? Cách duy nhất tôi tìm thấy để tránh là bằng cách thêm thuộc tính mới vào dạng xem dưới dạng cờ sẽ được kiểm tra trước khi chạy mã phương thức quan sát được.

Đây là jsfiddle liên kết cơ bản đang cung cấp với chức năng quan sát cơ bản HTML

<script type="text/x-handlebars" data-template-name="application"> 
    {{view MyApp.MyContainerView name="Santa Claus"}} 
</script> 
<script type="text/x-handlebars" data-template-name="foo"> 
    {{view.testProp}} 
</script> 

JS

MyApp = Ember.Application.create({ 
    autoinit: false 
}); 

MyApp.router = Ember.Router.create({ 
    root: Ember.Route.extend({ 
     index: Ember.Route.extend({ 
      route: '/' 
     }) 
    }) 
}); 

MyApp.ApplicationController = Ember.Controller.extend({}); 

MyApp.MyContainerView = Em.ContainerView.extend({ 
    childViews: ['foo'], 

    foo: Em.View.extend({ 
     testProp: 100, 
    testPropObservable: function(){ 
    console.log("Prop Observed"); 
    }.observes('testProp'), 
     init: function() { 
      this._super(); 
      this.set('testProp', 200);//i want to avoid obeserver here 
     }, 
     templateName: 'foo' 
    }) 
}); 

MyApp.initialize(MyApp.router); 

Trả lời

11

Một thay thế là để thêm/gỡ bỏ các nhà quan sát khi chạy. Với ví dụ trên, bạn có thể ngăn quan sát viên khỏi bị sa thải trong init() bằng cách gọi this.addObserver sau khi giá trị đã được khởi tạo

foo: Em.View.extend({ 
     testProp: 100, 
     testPropDidChange: function(){ 
     console.log("Value changed to: ", this.get('testProp')); 
     }, 
     init: function() { 
     this._super(); 
     this.set('testProp', 200);//i want to avoid obeserver here 
     this.addObserver('testProp', this.testPropDidChange) 
     }, 
     templateName: 'foo' 
    }) 

Xem jsfiddle này cho một ví dụ làm việc: http://jsfiddle.net/NSMj8/1/

Có một cái nhìn tổng quan tốt quan sát viên trong các hướng dẫn ember: http://emberjs.com/guides/object-model/observers/

Thông tin thêm về cách thêm/gỡ bỏ các nhà quan sát có sẵn trong các tài liệu API cho Ember.Observable: http://emberjs.com/api/classes/Ember.Observable.html

+0

Yea h, bạn chỉ nhanh hơn :), +1 BTW :) –

+0

mã đó chỉ là một ví dụ để làm việc trên nó .. tôi đồng ý rằng chúng tôi có thể thêm người quan sát trong quá trình khởi tạo .. tôi muốn biết nếu có anyway chúng ta có thể tránh cuộc gọi đến người quan sát trước khi đặt giá trị cho thuộc tính ... – thecodejack

+0

Không chắc chắn bạn đang hỏi chính xác điều gì. "Công việc" của một người quan sát là được thông báo khi một tài sản thay đổi. Để chắc chắn bạn có thể tránh các cuộc gọi đến các nhà quan sát bằng cách chờ đến sau để tạo chúng, như trong ví dụ trên. Một biến thể sẽ là có một người quan sát cho biết thêm một số người quan sát khác và có thể tự loại bỏ. Với điều đó tại chỗ bạn có thể 'tránh' người quan sát chính trên tập hợp ban đầu của tài sản. Đó là những gì bạn đang đi? –

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