我有一个ProfilesController和一个ProfileController,它们代表一个配置文件。

// Profiles listing
App.ProfilesController = Ember.ArrayController.extend({

});

// Single Profile representation
App.ProfileController = Ember.ObjectController.extend({

    isActive: false,

    actions: {

        edit: function() {

            // TODO: disable all profiles
            // does not work ... parentController is undefined. pseudo code only!
            this.get('parentController.children').forEach(function(profile) {
                profile.set('isActive', false);
            });

            // enable current profile
            this.set('isActive', true);
        }
    }
});

请注意,这不是完整的代码,这两个 Controller 在我的应用程序中具有更多代码,并且还有一个ProfileView使配置文件列表成为可能。

重要的部分是如何从ProfileController中访问父ProfilesController(即ArrayController)?

我已经尝试过(在编辑操作中):
this.get('parent') // => undefined
this.get('parentController') // => null
this.get('target') // => null

编辑:同时,我走下了对象树,并提出了一个令人难以置信的但可行的解决方案:
// disable all profiles
this.get('controllers.profiles.target._activeViews.profiles.0._childViews.0._childViews').forEach(function(childView) {
    childView.get('_childViews.0.controller').set('isActive', false);
});

在我更改模板结构中的某些内容之前,它一直有效。必须有一种更清洁的方式来做到这一点:-D

编辑2 :为了进一步说明,这是我的Profiles模板,其中profiles是Profile模型的集合(不是Controllers!每个模型都由Controller表示,因为我必须存储应用程序状态,如当前 Activity Profile等)。 ):
{{#each profile in profiles}}
    {{view App.ProfileView profileBinding=profile}}
{{/each}}

和ProfileView
App.ProfileView = Ember.View.extend({

     templateName: 'profiles/profile',

     init: function() {
         this._super();
         var profile = this.get('profile');

         // Here I explicitely create a ProfileController instance,
         // otherwise ProfilesController would be used instead of ProfileController
         // because in EmberJS by default the View's controller is always the parent controller
         this.set('controller', App.ProfileController.create());
         var controller = this.get('controller');
         controller.set('profile', profile);
     }
});

最佳答案

您可以在itemController循环中设置each属性,这样就不必手动创建ProfileController

{{#each profile in profiles itemController="profile"}}
    {{view App.ProfileView profileBinding=profile}}
{{/each}}

然后,您可以使用needs来确保将对ProfilesController的引用注入(inject)到每个ProfileController中。您将使用this.get('controllers.profiles')来访问ArrayController本身。如果您正在执行“Ember Way”操作,则需要访问该 Controller 的content属性(this.get('controllers.profiles.content'))。看起来您没有在执行“ Ember 之路”,而是将集合包含在该 Controller 的profiles属性中,而不是content属性中。在这种情况下,您将使用this.get('controllers.profiles.profiles')profiles的第一个实例获取ProfilesController,第二个实例获取在该 Controller 上设置的profiles属性。
App.ProfileController = Ember.ObjectController.extend({
    needs: ['profiles'],
    actions: {
        edit: function() {

            this.get('controllers.profiles.profiles').forEach(function(profile) {
                profile.set('isActive', false);
            });

            // enable current profile
            this.set('isActive', true);
        }
    }
});

关于javascript - EmberJS-如何从子 Controller 中访问父 Controller ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19253143/

10-12 16:24