【问题标题】:Ember - How to call a View method after Controller methodEmber - 如何在控制器方法之后调用视图方法
【发布时间】:2012-12-16 14:01:51
【问题描述】:

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

模板:

<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.您的控制器不知道该视图(它没有持有对它的引用)。我认为这在最近的 ember 版本之一中有所改变。 2. 为什么要在视图中存储属性“isUpdate”?为什么不存储在控制器中?这样你就可以在模板中使用 {{#if isUpdate}} 并且 Ember 会自动更新 DOM。您的方法似乎很尴尬,因为您尝试手动更新视图。 Ember 中的常规做法是:更新模型,视图自动反映更改。

标签: javascript model-view-controller ember.js


【解决方案1】:

控制流逻辑更适合控制器。让视图保持无状态通常是一个好主意,并且控制器不应该知道视图。您可以将更新标志和功能移动到您的控制器,并在您的 Handlebars 模板中定位控制器。视图的 Handlebars 模板类似于:

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

那么控制器就会有更新逻辑:

App.MainController = Em.Controller.extend({
    isUpdated: false,
    showUpdate: function() {
        this.set('isUpdated', !this.get('isUpdated'));
    }
});

视图现在只是模板名称:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2022-01-20
    相关资源
    最近更新 更多