2013-06-27 5 views
2

При использовании хелпера linkTo в шаблоне ручек Ember устанавливает правильный URL-адрес для ссылки с помощью сериализатора, который я добавил на маршрут:Ember (data) linkTo без прохождения модели, просто введите новую модель

serialize: function(slug, params) { 
    var name, object; 
    object = {}; 
    name = params[0]; 
    object[name] = slug; 
    return object; 
} 

И когда я нажимаю на ссылку, Ember переходит на правильную страницу с правильным пугом и всем, но у нее нет правильных данных, и это говорит об этом. Я считаю, что это потому, что то, что я передаю в свой оператор linkTo как второй параметр, - это просто пуля, а не вся модель.

Можно ли заставить Ember просто извлекать данные так, как если бы я просто набрал URL-адрес в адресной строке вместо того, чтобы полагаться на модель (то есть нет), переданную в оператор linkTo?

UPDATE Я попытался это внутри метода АКТИВИРУЙТЕ на моем пути, но теперь, кажется, проблема в том, что рендеринг должен ждать, пока это не будет сделано.

activate: function() { 
    this.context.isLoaded = false; 
    this.model(this.context.query.slug); 
} 

Любые идеи? Может быть, даже с более красивым решением?

ответ

4

Решение, которое я придумал, наконец, с помощью некоторых ребят на IRC, должен был использовать setupController крюк, как вы говорите, Даршан, и сериализатору так:

CustomRoute = Ember.Route.extend({ 
    setupController: function(controller, model) { 
     var modelName = this.routeName.substr(0, 1).toUpperCase() + this.routeName.substr(1), 
      slug = model; 
     if (model.hasOwnProperty('slug')) 
      slug = model.slug; 
     controller.set('model', App[modelName].find({'slug': slug})); 
    }, 
    serialize: function(slug, params) { 
     var name, object; 
     object = {}; 
     name = params[0]; 
     object[name] = slug; 
     return object; 
    } 
}); 

Таким образом, вы можете предоставить только пул маршрута в качестве второго параметра для хелпера linkTo вместо модели, и сериализатор правильно установит URL-адрес, а затем setupController проверит, имеет ли модель свойство slug , что правильно означает, что это подходящая модель, и если это не так, то просто догадывается, что модель - это просто пуля, и то он будет использовать метод DS.Model.find, чтобы вернуть обещание магазину моделей контроллеров.

Потому что setupController вызывается каждый раз, когда вводится маршрут, где, когда крюк модели иногда вызывается, метод DS.Model.find будет использоваться каждый раз, чтобы получать данные через обещание, а voila - извлекать данные каждый раз вы вводите маршрут.

Предполагается, что вы используете Ember.Data и что ваш объект модели называется App. * Название маршрута *, начинающееся с заглавной буквы, но его можно легко модифицировать, чтобы он соответствовал любой потребности.

Для всех маршрутов в моем приложении я теперь подкласс (простираюсь) от этого маршрута, тем самым получая желаемое поведение для всех моих маршрутов.

0

Вы можете попробовать использовать имя пули в Маршруте, а затем загрузить данные для Маршрута, используя findQuery вместо find.

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

App.ProductRoute = Ember.Route.extend({ 
    model: function(params) { 
    return App.Product.query({name:params.slug}); 
    } 
}); 
+1

Метод только что называется запросом прямо сейчас и является псевдонимом для DS.Store.findQuery, да? В любом случае - что делать? Проблема не в том, что она не может найти что-либо. Проблема заключается в том, что метод-маршрут маршрута * не * выполняется, если маршрут имеет динамический сегмент и переходит к, например, через, например, linkTo helper, который я хочу изменить, чтобы он всегда выполнялся. – chrisbuchholz

+0

Да, исправлено это. –

+1

Маршрут через url получает его модель через крючок модели, а через render/linkTo помогает непосредственно через setupController, пропуская крючок модели. В обоих случаях маршрут все равно получит свою модель. Или я не понимаю вопрос правильно? –