Canjs findall и findone?

Итак, прямо сейчас я получаю доступ к данным, используя findAll: 'GET api.php/stores-for-you?pid=977&sid=5938&max_fav=3&max_reco=3', который является способом доступа к API для моего приложения, где pid - это страница. id и sid — это идентификатор раздела. Таким образом, каждая страница имеет разные pid и sid. Так что на данный момент я должен сделать вызов findall для каждого вызова API, что я считаю не очень хорошим вариантом.

Я думал, могу ли я использовать findone вместе с Findall здесь. где я могу получить доступ к API для конкретных магазинов для вас, а затем использовать findone, чтобы перейти к конкретному URL-адресу с параметрами.

Может кто-нибудь мне помочь. Если вопрос все еще не ясен, вы можете просто написать мне, я постараюсь объяснить это подробнее.


person user3083664    schedule 23.12.2013    source источник
comment
Вы бы лучше упростили свой вопрос, иначе никто вам не ответит. stackoverflow.com/questions/how-to-ask   -  person waldyr.ar    schedule 24.12.2013


Ответы (1)


В вашем findAll не должны быть жестко закодированы идентификаторы страницы и раздела в строке GET, поскольку это сделало бы ваш can.Model специфичным только для этой страницы. Ваш код, который вызывает findAll, должен предоставлять их.

Подклассы can.Model представляют тип данных, которые вы получаете с сервера. findAll предназначен для извлечения некоторого количества объектов этого типа. Ваша строка GET, похоже, хочет вернуть магазины. Мы могли бы назвать вашу модель WebStore (я избегаю использования слова «Магазин», потому что это слово имеет другое значение в CanJS).

can.Model.extend("WebStore", {
  findAll : "GET /api.php/stores-for-you?max_fav=3&max_reco=3"
}, {});

В этой спецификации для вашего findAll мы оставили некоторые ключи пейджинга (max_fav и max_reco, похоже, являются ограничителями результатов), чтобы другой код не мог запросить 3000 результатов за раз. Другие, однако, предназначены для определенных страниц. Это фактически запросы. Если вы поместите их в свою спецификацию findAll, ваша Модель сможет получить только эту страницу, что ограничит ее повторное использование.

так что теперь в другом коде, вероятно, прототип контроллера init():

var ws_ajax = WebStore.findAll({ pid : 977, sid : 5938 });
ws_ajax.done(function(stores) {
  //Handle the array of 0-3 stores returned from the server. 
});

Итак, теперь вы можете вызывать другие страницы и разделы позже в другом коде, просто выполняя тот же вызов с другими значениями pid и sid. Вам не нужно пытаться взломать findOne для другой страницы.

ОДНАКО... если по какой-то причине вы часто используете эту конкретную комбинацию страницы/раздела, вы можете рассмотреть возможность использования другой функции в статических свойствах вашей модели онлайн-магазина, и тогда это будет выглядеть так:

can.Model.extend("WebStore", {
  findAll : "GET /api.php/stores-for-you?max_fav=3&max_reco=3",

  findMyPage : function() {
    return this.findAll({ pid : 977, sid : 5938 });
  }
}, {});

Обратите внимание, что findMyPage не имеет особого значения в CanJS. Вы просто обертываете findAll часто используемыми значениями, чтобы избавить себя от лишней головной боли при вводе и обслуживании, если эти значения изменятся.

Упражнение, оставленное читателю, состоит в том, чтобы реализовать "findMyOtherPage", который найдет... вашу другую страницу.

РЕДАКТИРОВАТЬ: более подробная информация добавлена ​​по запросу.

person air_hadoken    schedule 24.12.2013
comment
Я новичок в этом, можете ли вы объяснить подробный способ ?? - person user3083664; 24.12.2013
comment
Я обновил ответ более подробно. Это помогает? - person air_hadoken; 25.12.2013
comment
Это сработало большое спасибо. также я могу динамически изменять поле max_fav=3&max_reco=3. Также я могу иметь несколько findAll в одной модели. - person user3083664; 26.12.2013
comment
Главное, я хочу изменить раздел после api.php, т.е. store-for-you?max_fav=3&max_reco=3 динамически, а также идентификатор страницы и идентификатор раздела, есть ли какой-то способ сделать это. - person user3083664; 26.12.2013
comment
Да, но не используйте строковый формат для вашей спецификации findAll, если вы хотите использовать 3 по умолчанию, а затем переопределить их. вместо этого используйте объект: findAll : { url : "/api.php/stores-for-you", type : "get", data : { max_fav : 3, max_reco : 3 }} - person air_hadoken; 27.12.2013
comment
Dotwoff = can.Model.extend(dotwoff,{ findAll: {url: '/api.php/specialoffers?', type: 'GET', data: {max: 1, pid: 977, sid: 9081} } }, {}); это то, что я сделал, и работает нормально. Итак, теперь я могу просто отложить/переопределить значения позже для другого набора значений, используя те же данные: ??? - person user3083664; 30.12.2013
comment
Например, Dotwoff.findAll({ sid : 9082 }) будет разрешаться в следующий раздел, так что да, я думаю, вы поняли - person air_hadoken; 31.12.2013
comment
как мне написать элемент управления для того же, я немного смущен - person user3083664; 31.12.2013
comment
Я вызываю функцию управления, используя Featoff.findAll({}, function(offerResponse) { new Feat('.mn_featStr', { offerdata: offerResponse }); }); а основная функция определена в файле control.js Feat = can.Control({ init: function() { this.element.html(can.view('images/js/mn/temps/featured.ejs', { offerdata : this.options.offerdata, secTitle: this.element.attr('data-title') }));} }); есть ли способ объединить эти два - person user3083664; 31.12.2013
comment
Вместо этого ваша функция init() может сделать следующее: var that = this; can.view("images/js/mn/temps/featured.ejs", Featoff.findAll({})).done(function(frag) { that.element.html(frag); }) Если вы передаете can.Deferred в качестве данных для can.view, вы возвращаете can.Deferred, который преобразуется в представление, отображаемое с данными. Если вы не знаете, как использовать Deferred или Promises, изучите их прямо сейчас, так как они избавят вас от массы головной боли. - person air_hadoken; 01.01.2014
comment
при чем тут фраг? параметры - person user3083664; 02.01.2014
comment
Feat = can.Control({ init: function() { var that = this; can.view('images/js/mn/temps/featured.ejs', featoff.findAll({})).done(function(frag ) { that.element.html(frag);offerdata: that.options.offerdata, secTitle: that.element.attr('data-title') }); })); }); это хорошо выглядит??? - person user3083664; 02.01.2014
comment
параметр функции обратного вызова называется frag, потому что это фрагмент документа. Похоже, вам нужно отправить больше свойств в шаблон представления; Я пропустил это в первый раз. поэтому бит findAll будет выглядеть так: ...red.ejs', Featoff.findAll({}).then(function(d) { return { offerdata : d, secTitle : that.element.data('title') }; })).done(function(fr... - person air_hadoken; 03.01.2014
comment
Я запутался, передавать ли offerdata: d или я должен передать его с that.options.elements ?? - person user3083664; 03.01.2014
comment
Привет перепробовал все комбинации с Feat = can.Control({ init: function() { var that = this; can.view('images/js/mn/temps/featured.ejs', Featoff.findAll({}) .then(function(d) { return { offerdata : d, secTitle : that.element.data('title') }; })).done(function(frag)) { that.element.html(frag); } } }); но все же он показывает мне некоторую синтаксическую ошибку с линией возврата - person user3083664; 03.01.2014
comment
у вас слишком много правых скобок после frag и вам не хватает одной после обратного вызова done. - person air_hadoken; 07.01.2014
comment
Feat = can.Control({ init: function() { var that = this; can.view('images/js/mn/temps/featured.ejs', featoff.findAll({}).then(function(d) { return { offerdata : d, secTitle : that.element.data('title') }; })).done(function(frag) { that.element.html(frag); }) }}); это работает сейчас. Просто хотел узнать, какой метод следует использовать для повторного использования вышеуказанного шаблона с другим набором параметров данных в findALL??? и как это сделать?? - person user3083664; 07.01.2014
comment
А также у меня есть этот вопрос, почему нам нужно создавать разные элементы управления для каждого раздела? можем ли мы иметь один базовый контроллер и просто повторно использовать его с переопределением представления шаблона и параметров. - person user3083664; 07.01.2014
comment
Также могу ли я иметь несколько представлений внутри одного элемента управления со многими шаблонами. ?? - person user3083664; 07.01.2014
comment
Слишком много вопросов для этой ветки комментариев. Задавайте новые SO-вопросы. - person air_hadoken; 08.01.2014
comment
Feat = can.Control({ init: function() { var that = this; can.view('images/js/mn/temps/featured.ejs', featoff.findAll({}).then(function(d) { return { offerdata : d, secTitle : that.element.data('title') }; })).done(function(frag) { that.element.html(frag); }) }}); это работает сейчас. Итак, теперь я хочу повторно использовать один и тот же элемент управления Feat с другим набором параметров в findAll. Как мне это сделать? Какой метод использовать и как использовать ?? также могу ли я также отложить или переопределить can.view для того же ?? - person user3083664; 08.01.2014
comment
Слишком много вопросов для этой ветки комментариев. Поднимитесь наверх страницы и нажмите Задать вопрос. - person air_hadoken; 08.01.2014
comment
поэтому я объявляю элемент управления как var a = can.Control.extend({}). Таким образом, переменная является частной в пределах области действия функции. в чем преимущество использования var по сравнению с объявлением пустого объекта var b={} и последующим определением элемента управления, например b.a = can.Control.extend() - person user3083664; 16.01.2014