2012-12-16 59 views
1

主要思想:在我的控制器成功更新模型上的属性之后,我想调用一个关闭子视图的view方法。Ember - 在控制器方法之后如何调用View方法

模板:

<a {{action showUpdate href=true target="view"}}>update</a> 

    {{#if view.isUpdate}} 
     {{#view App.UpdateView}} 
      ...here is a form 
      <button {{action update}}>Send</button> 
     {{/view}} 
    {{/if}} 

查看:

App.MainView = Ember.View.extend({ 
    templateName: 'update', 
    isUpdate: false, 
    showUpdate: function() { 
     this.set('isUpdate', !this.get('isUpdate')); 
    } 
}); 

App.UpdateView= Ember.View.extend(); 

控制器:

App.MainController = Ember.Controller.extend({ 
    updateCon: function() { 
       do something 
    }, 
     ... 

路由器:

update: function(router, evt) { 
    router.get('mainController').updateCon(); 
    //router.get('mainController.view').showUpdate(); <-- doesnt work 
} 

所以我试图在我的控制器做好之后在我的路由器中调用它,但它不起作用。

Cannot call method 'showUpdate' of null 

这是正确的做法吗?当是时:我错过了什么?否:当我的控制器执行某些操作时如何使视图变形?

+1

1。您的控制器不知道该视图(它没有提及它)。我认为这在最近的一个发布版中已经发生了变化。 2.为什么要在视图中存储属性“isUpdate”?为什么不存储在控制器中?这样你可以在模板中使用{{#if isUpdate}},Ember会自动更新DOM。您的方法看起来很尴尬,因为您尝试手动更新视图。 Ember中的常规方法是:更新模型,视图自动反映更改。 – mavilein

回答

5

控制流逻辑更适合于控制器。保持视图无状态并且控制器不应该了解视图通常是一个好主意。您可以将更新标志和功能移动到您的控制器,并将您的Handlebars模板中的控制器作为目标。视图的把手模板会是这样的:

<a href="#" {{action showUpdate target="controller"}}>update</a> 
{{#if isUpdated}} 
    ... 
{{/if}} 

然后,控制器将有更新的逻辑:

​​

认为现在只不过是模板名称:

App.MainView = Em.View.extend({ 
    templateName: 'update' 
});