2014-01-04 3 views
1

Это может быть скорее вопрос структуры, но заголовок - это моя текущая проблема.EmberJS: Доступ к функциям дочернего контроллера у родителя

У меня есть следующие основные приложения:

var App = Ember.Application.create(); 

App.ApplicationAdapter = DS.FixtureAdapter.extend(); 

App.Router.map(function() { 
    this.resource('numbers', { 
     path: '/' 
    }); 
    this.resource('users'); 

}); 

App.UsersRoute = Ember.Route.extend({ 
    model: function (params) { 
     return this.store.findAll('user'); 
    } 
}); 

App.NumbersRoute = Ember.Route.extend({ 
    model: function (params) { 
     return this.store.findAll('number'); 
    } 
}); 

App.User = DS.Model.extend({ 
    name: DS.attr('string'), 
    numbers: DS.hasMany('number', { 
     async: true 
    }) 
}); 

App.Number = DS.Model.extend({ 
    value: DS.attr('number'), 
    user: DS.belongsTo('user') 
}); 


App.NumbersController = Ember.ArrayController.extend({ 
    total: function() { 
     var total = 0; 
     this.forEach(function (number) { 
      total += parseFloat(number.get('value')); 
     }); 
     return total; 
    }.property() 
}); 

App.User.FIXTURES = [{ 
    id: 1, 
    name: 'Bob', 
    numbers: [100, 101] 
}, { 
    id: 2, 
    name: 'Fred', 
    numbers: [102] 
}]; 

App.Number.FIXTURES = [{ 
    id: 100, 
    value: 25, 
    user: 1 
}, { 
    id: 101, 
    value: 15, 
    user: 1 
}, { 
    id: 102, 
    value: 60, 
    user: 2 
}]; 

Рабочий пример с шаблонами здесь: http://jsfiddle.net/sweetrollAU/9DuR3/

Пример показывает связь между пользователями и числами. Первая страница - это список всех номеров в приложении, их связанный пользователь и общее количество всех номеров. Ссылка «Пользователи» показывает один и тот же контент, но каждый пользователь должен показать свою промежуточную оценку для номеров, которые у нее есть.

Мой вопрос в основном, как я могу получить доступ к методу NumbersController 'total' в моем UserController? Должен ли я получить доступ к этому методу или у меня неправильная структура?

Благодаря

+0

Спасибо за ваши ответы. Оба ответа были более чем достаточными, но выбрали второе для этого варианта использования. – sweetroll

ответ

1

@ ответ kingpin2k кажется достаточно, но вот еще один способ сделать это:

http://jsfiddle.net/9DuR3/3/

Что здесь происходит, что числа визуализируются снова, для каждого пользователя, но на этот раз с другим шаблоном. А именно, между тегами {{render}}. NumbersController предоставляется с коллекцией , а не с полным набором номеров.

Также важно указать, какие функции зависят от функции total (.property('@each.value')).

2

В вашем случае они похожи логика, но в конечном итоге они приходят из разных источников данных. Вы все равно можете создать Mixin, который поможет вам совместно использовать код среди разных объектов Ember.

App.AddNumberMixin = Em.Mixin.create({ 
    sumNumbers: function(arr){ 
     var total = 0; 
     arr.forEach(function (number) { 
      total += parseFloat(number.get('value')); 
     }); 
     return total; 
    } 
}); 

App.UserController = Ember.ObjectController.extend(App.AddNumberMixin, { 
    total: function() { 
     return this.sumNumbers(this.get('numbers')); 
    }.property('[email protected]') 
}); 

App.NumbersController = Ember.ArrayController.extend(App.AddNumberMixin, { 
    total: function() { 
     return this.sumNumbers(this); 
    }.property('@each.value') 
}); 

http://jsfiddle.net/9DuR3/2/

Смежные вопросы