2015-10-16 42 views
0

模板觀察員火災行動提前。行動之前是初始化觀察激發的動作

<script type="text/x-handlebars"> 
    <h2>Welcome to Ember.js</h2> 
    {{outlet}} 
</script> 

<script type="text/x-handlebars" data-template-name="index"> 
    <ul> 
    {{input type="text" value=model.name}} 
    </ul> 
    <p {{action 'test'}}>test</p> 
</script> 

燼代碼

App = Ember.Application.create(); 

App.Router.map(function() { 
// put your routes here 
}); 

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    return Ember.Object.create({name:'dilip'}); 
    }, 
    actions:{ 
    test:function(){ 
     alert('route test'); 
     console.log('test') 
    } 
} 
}); 

App.IndexController = Ember.Controller.extend({ 
    handleChange:function() 
    { 
    console.log('handle') 
    this.send('test') 

    }.observes('model.name') 
}) 

行動「測試」的路線已經確定,但是當我使用它的下面顯示error.This錯誤來,只有觀察。

加載路由時出錯:錯誤:沒有處理操作'測試'。

+0

我剛打這個。看來觀察員在控制器不準備向路線發送動作的時候發生火災。 –

回答

0

觀察者看火災前的路線是準備好處理動作交互的組件這是最常用。這種有點合理,因爲控制器是作爲路線的一部分「建造」的。我已經通過在路線setupController鉤子內設置一個屬性來解決這個問題,讓控制器知道它已經準備好了!

// Route 
setupController: function(controller, model) { 
    this._super(controller, model); 
    controller.set('routeIsReadyForAction', true); 
} 

// Controller 
routeIsReadyForAction: false, 

someObserver: function() { 
    if (!this.get('routeIsReadyForAction')) { 
     return; 
    } 

    this.send('someRouteAction'); 
}.observes('someProperty'), 
+0

謝謝@Collin james –

+0

嗨@dilip。如果你喜歡我的答案,你是否接受它作爲正確的答案? –

0

你應該在控制器中定義你的動作。

this.send('test')尋找此擴展類中的操作(在本例中爲控制器)。如果你使this.sendAction('test')它出去並尋找動作,但是這些必須被預定義,就像`actionName =「actionName」一樣。當你有一個需要與控制器

{{my-component actionName="actionName"}} < sendAction now looks for controllers action 
+0

實際問題是觀察者在第一次數據加載時觀察到的。它在數據改變時會觀察到。 –

+0

觀察model.hasDirtyAttributes。 –

+0

你錯誤說沒有處理行爲'測試'..所以它不是關於觀察者,在給定的控制器中沒有這樣的動作。咄。 –