derbyparty / derby-faq Goto Github PK
View Code? Open in Web Editor NEWDerby 0.6 FAQ
Derby 0.6 FAQ
When I need to pass to my app an expressapp
or store
, I'm calling it require("./app")(expressapp, store)
and wrapping it into a function:
module.exports = function (expressapp, store) {
var derby = require("derby"),
app = derby.createApp("my-app-name", __filename);
global.app = app;// for development only
// some code here, using expressapp and store...
return app;
};
Works fine, except global.app = app;
. In this way (with module.exports = function (...
) I can't access my app
from browser console. Why??
On the client/server before (during the derby.js v6.*) could use the channel as set forth in this document derby-faq
Now, is not possible to do it.
You always will get an error on the client: TypeError: app.model.channel is undefined
code app.model.channel.send
And on the server - TypeError: Cannot call method 'on' of undefined
code client.channel.on
Please, help me to resolve the problem - communication between client-server or server-client with channels.
If this problem is not relevant today, could you show a new solution?
Hello.
I'm working on md-button component. It has a condition — normally it should be rendered as a button element, but if href
attribute is provided it should be rendered as an anchor.
How can I optimise the below template and either get rid of conditional statement or avoid atrributes copy/pasting?
View:
<index: element="md-button">
{{ if @href }}
<a
class="md-button {{ @class }} {{ disabledClass }}"
href="{{ @href }}"
role="{{ @role }}"
tabindex="{{ @tabindex }}"
target="{{ @target }}"
title="{{ @title }}"
on-click="handleClick($ev, $el)"
on-dblclick="handleDblclick($ev, $el)"
on-mousedown="handleMousedown($ev, $el)"
on-mouseup="handleMouseup($ev, $el)"
on-mouseover="handleMouseover($ev, $el)"
on-mouseout="handleMouseout($ev, $el)"
on-focus="handleFocus($ev, $el)"
on-blur="handleBlur($ev, $el)"
>
<span class="md-button__label">{{ @content }}</span>
<md-ripple />
</a>
{{ else }}
<button
class="md-button {{ @class }} {{ disabledClass }}"
disabled="{{ @disabled }}"
role="{{ @role }}"
tabindex="{{ @tabindex }}"
title="{{ @title }}"
type="{{ @type }}"
on-click="handleClick($ev, $el)"
on-dblclick="handleDblclick($ev, $el)"
on-mousedown="handleMousedown($ev, $el)"
on-mouseup="handleMouseup($ev, $el)"
on-mouseover="handleMouseover($ev, $el)"
on-mouseout="handleMouseout($ev, $el)"
on-focus="handleFocus($ev, $el)"
on-blur="handleBlur($ev, $el)"
>
<span class="md-button__label">{{ @content }}</span>
<md-ripple />
</button>
{{ / }}
hi zag2art
We should concentrate our forces to bring that to english. Then I would be more than happy to translate this to french.
cheers
Пункт. А что делать, если у меня уже есть готовая mongodb-база данных, ее можно использовать с derby?
Если следовать инструкции выдает ошибку если редис не запущен. Стоит как-то отразить этот факт.
Привет.
Здесь показано как инициировать RPC, но без авторизации пример не полный. Можно ли как-то вытащить сессию и/или текущего пользователя из client
?
В факе для handlebars пишут что луп работает так: {{#each myObject}}
, но в дерби так не получается.
Я временно вышел из ситуации с помощью {{ each Object.keys(_page.obj) }}
, но мне этот костыль не нравится.
Hello.
I’d like to raise react.js question. What are the reasons to support derby these days? Wouldn’t it better to create racer + react + express setup instead of derby? As a result you would cut down the development costs (another year passed and derby still is .6 alpha) and get an access to tons of react components.
https://github.com/derbyjs/derby-examples - вот тут есть пример чата, который (возможно только у меня), странно работает. Суть в том, что для просмотра новый сообщений в этом чате, приходиться "рефрешить" окно браузера.
А есть пример чата как реалтайм приложения?
В частности, меня интересует, как подписаться на изменения в коллекции(или среза(фильтра) коллекции), чтобы все подписчики видели их изменения.
Can I use projection for subscribe and reactively update data in it's collection? Or projections are for read-only?
не работает: model.subscribe('_page.someTextField', function(){})
Всем привет, подскажите как обрабатывать в компонентах атрибут который передается как ParentWrapper ? Пример, задана функция в родительском компоненте:
...
test: ()-> if false then "kabuuu" else "kuiaaa"
...
и создание дочернего:
<view name="olala" testattribute="{{ test() }}" />
в классе дочернего компонента:
init:(model)->
console.log model.get "testattribute"
выводит что то типа:
ParentWrapper {template: DynamicText, expression: FnExpression, content: undefined, type: "ParentWrapper", serialize: function…}
expression: FnExpression
template: DynamicText
__proto__: Template
Как с этим работать?
Привет.
Как лучше реализовать следующий сценарий:
Как зашифровать пароль мне понятно, но как лучше обеспечить разделение данных? Очевидно также, что оно должно происходить на сервере.
Привет всем. Сразу к делу!
Суть в том, что хочется создать что-то типа значение selected
у option
(вложенного в select
), но у span
с input(type='text')
.
То есть создать компонент типа "изменяемый текст" - надпись, которая, если нажать, заменяется на поле ввода, пользователь редактирует значение, нажимает Enter
и значение обновляется (у других пользователей в том числе).
Есть уже готовая реализация данного компонента, но был обнаружен баг в самом фреймворке (или у меня руки из Ж, подскажите).
В общем тестовый проект
В пустом проекте в index.jade
each _page.items
button.btn.btn-default(on-click='deleteItem(this.id)') {{this.title}}
test-comp(value='{{this.title}}')
и в index.js
app.component(require('../../components/test-comp'));
app.proto.deleteItem = function(id) {
this.model.del('items.' + id);
}
app.get('/', function(page, model) {
model.subscribe('items', function() {
if (!model.get('items')) {
model.add('items', { title: 'item 1'});
model.add('items', { title: 'item 2'});
model.add('items', { title: 'item 3'});
model.add('items', { title: 'item 4'});
model.add('items', { title: 'item 5'});
}
model.filter('items', true).ref('_page.items');
page.render('home');
});
});
(стандартная часть пропущена)
Создаём в папке component
папку test-comp
В самом компоненте index.jade
index(element='test-comp'):
p {{@value}}
p
b {{value}}
index.js
компонента
module.exports = TestComp;
function TestComp() {}
TestComp.prototype.view = __dirname;
TestComp.prototype.init = function(model) {
model.subscribe('value', function() {
console.log('value: ' + model.get('value'));
model.on('change', 'value', function(n, o) {
console.log('value changed from ' + o + ' to ' + n);
})
});
}
Всё хорошо работает и правильно отображается до тех пор, пока не начать кликать на кнопки. Значение простого текста меняется правильно, а значение полужирного ведёт себя странно. Как раз в index.js
компонента строка model.subscribe('value', ...)
подписывается как раз на выделенное жирным значение, что видно в консоли.
Вывод консоли при удалении третьего элемента:
value changed from item 3 to undefined
value changed from item 4 to item 5
value changed from item 5 to undefined
Подписка на @value
не работает. Как можно корректно обрабатывать изменение значения аттрибута?
Рассчитываю на вашу помощь
Спасибо
PS. Спасибо за прекрасный фреймворк, некоторые вещи делаются оочень просто, приятно работать. Но и вопросов много, надеюсь смогу найти ответы.
Добрый день, в faq en есть такие строки
for (var id in app.clients) {
app.clients[id].channel.send('myEvent', data);
}
в app.clients хранится объект подключенных к приложению пользователей, но если app не является глобальной переменной, допустим в production, то app.clients будет пустой.
Вопрос: где взять подключенных клиентов к серверу когда app не глобальна.
Привет.
Есть еще такая проблема. Вечером оставляю открытую вкладку с дерби-приложением, а утром нахожу труп запись в консоли: Failed to load resource: net::ERR_CACHE_MISS
А если покликать по ссылкам, то меняется только адресная строка, а рендер не происходит.
В консоли после такого клика появилось: WebSocket: connection is broken CloseEvent {reason: "", code: 1006, wasClean: false, clipboardData: undefined, path: NodeList[0]…}
Это проблема самого дерби или проблема его конфигурации? Хочется сделать, так, чтобы он по возможности сам восстанавливал соединение.
Привет.
Хочу поинтересоваться какие есть практики насчет производительности дерби в реальной жизни? Как много клиентов/запросов он у вас обслуживает?
Мы столкнулись с ситуацией когда нода съедает весть процесс при всего лишь 32 RPS. Приложение работает таким образом, что создает много подписок на один запрос. Используем browser channel а не сокеты, возможно на сокетах увидим другую картину.
А как у вас обстоят дела с нагрузкой?
Привет.
Я задумал перевести приложение с экспресса на дерби и хочу посоветоваться. У меня есть список постов, у каждого поста есть счетчик просмотров. Лог просмотров мне не требуется, поэтому для меня OK хранить счетчик как item.cnt.views
, соответсвенно при каждом просмотре сервер увеличивает (model.increment) значение счетчика. Кроме того я не хочу выносить счетчик в лог, потому что для вывода счетчика потребуется создавать лишнюю подписку.
Вроде бы все просто, но во-первых из доков не ясно как будет происходить синхронизация. При изменении поля, дерби перешлет подписчикам только новое значение поля или же весь item
. Ожидаемо, что нужно передавать только значение поля, но уверенности нет.
Вторая проблема это индексция поисковиком. Мне бы хотелось использовать эластик ривер, но при более-менее приличной нагрузке эластик окажется загружен бессмысленной индексацией записей у которых обновился только счетчик, возможно кто-то уже сталкивался чем-то подобным и есть наработки? Кстати как у монго сейчас обстоят дела с поиском, он уже пригоден к использованию (стеммминг, производительность)?
Привет, хочу спросить какие практики работы датой существуют в Дерби.
Сейчас Дерби записывает дату как стринг и разработчики говорят, что дату нужно хранить в виде тайштампа.
Проблема в том, что в обоих случаях происходит потеря информации, например часовой пояс теряется. Что если сайтом пользуются люди из разных часовых поясов? Ну или кто-то умышленно отвел часы назад?
Получается, создавать дату на клиенте — моветон — можно только на сервере.
Допустим, я создаю фейсбук и мне нужно вывести меню архива: https://www.dropbox.com/s/peawsgvw07o8z08/Screenshot%202014-07-26%2014.39.47.png
Из таймштампа не получить группировку по году. Остается хранить год (и месяц) отдельно (избыточность), допустим мы сделали это. Как тогда сделать запрос с группировкой (исходим из того что на клиенте мы не хотим грузить и фильтровать большие массивы данных)?
Я видел в группе совет про использование звездочки
app.get "*", (page, model, params, next)-> ... next()
Но он рабоатет только в пределах одного приложения. Если же в проекте несколько приложений, то происходят нерелевантные подписки.
Есть ли другие способы создать подписку на несколько запросов и раздать ее всем роутам в пределах приложения?
Добрый день.
Мне нужно чтобы в локальной переменной находилось актуальное серверное время, чтобы в дальнейшем с ним работать. Как мне поместить серверное время Date().getTime() в _session.time ?. так же нужно обновление на стороне сервера по setInterval
У нас недавно появилась ошибка при рендере на клиенте такого характера:
p.localUpdate @ eventmodel.js:333
p.update @ eventmodel.js:349
p._set @ eventmodel.js:416
(anonymous function) @ eventmodel.js:537
p._each @ eventmodel.js:303
p._each @ eventmodel.js:314
p._each @ eventmodel.js:314
p._each @ eventmodel.js:314
p.mutate @ eventmodel.js:519
p.set @ eventmodel.js:536
(anonymous function) @ Page.js:151
i @ events.js:232
i.emit @ events.js:99
u.emit @ events.js:77
i @ mutators.js:41
s._mutate @ mutators.js:15
s._set @ mutators.js:44
s.set @ mutators.js:31
t.exports.t.setState @ lenta-item-post.coffee:2
t.exports.t.bootstrap @ lenta-item-post.coffee:2
(anonymous function) @ lenta-item-post.coffee:20
u.wrapCallback @ events.js:44
s.add @ util.js:54
(anonymous function) @ browser.js:24
Возникает непонятно по какому принципу, уже переделал код одного компонента что бы избавиться от нее, но как только избавился в одном компоненте она появилась из другого компонента.
Подскажите в чем может быть проблема? Где искать решение ? Заранее спасибо.
Hello.
It's not clear to me from the docs would derby care of dom event listeners or not.
Here is my case:
module.exports = class View
view: __filename.replace /\.[^\.]+$/, ""
create: (model, dom) ->
model.setNull "ripples", []
dom.on "mousedown", @container.parentNode, (ev) =>
@push ev.layerX, ev.layerY
delay 100, => @shift() if ev.button
dom.once "mouseup", (ev) =>
return unless model.get "current"
@shift()
ev.stopPropagation()
I suspect that I have to remove the listener manually, but the thing is that derby doesn't pass dom
object to destroy
method.
На сколько я понимаю все изменения в моделях записываются в БД с соответствующим номером версии. При частом обновлении БД начинает дико рости в объеме. Есть ли какой-то способ это предотвратить?
Прочитал замечание про то, что все подписки лучше делать в контроллере, однако никак не соображу как же в таком случае делать в компоненте реактивные привязки.
Привязываюсь в контроллере к докумену
model.subscribe('messages.hello', function() {
model.ref('_page.message','messages.hello');
page.render();
});
В основном шаблоне привязка работает корректно
<h1>{{_page.message.message}}</h1>
<input value="{{_page.message.message}}"/><br/>
меняя текст, меняется и заголовок.
В этом же шаблоне передаю данные в компонент
<panel data={{_page.message}} />
В шаблоне компонента связываю данные с полем ввода - пробовал оба варианта - локально и глобально.
<input type="text" value="{{#root._page.message.message}}">
<input type="text" value="{{data.message}}">
Значения передаются корректно - тут вопросов нет. Но ни в первом ни во втором случае не происходит реактивного связывания - изменения поля в компоненте не приводит к изменению модели и наоборот.
Что нужно сделать для установки в компоненте реактивной привязки к данным, которые были получены как параметры?
Привет.
Я посмотрел урок и заметил, следующее упущение в том как используется share-access.
Допустим у нас есть огромная коллекция, которую мы открыли для чтения. Приложение использует подписки с лимитами, но остается дыра через которую некто может выполнить запрос на подписку ко всей коллекции что может уронить канал или сервер.
Вопрос, как нам разрешить подписки, но при этом через политику ограничить количество передаваемых в одной подписке объектов?
В faq описано как в компоненте связать результат запроса с локальным путем.
Такая конструкция работает корректно
var q = model.root.query('project',{});
model.subscribe(q,function(){
model.ref('formdata',q);
});
Как сделать связь не с запросом, а с конкретным документом?
Аналогичная конструкция со scoped моделью отказывается работать
var scoped = model.root.at('project.986690fa-37f6-4e03-b97b-99ef04875d2b');
model.subscribe(scoped,function(){
model.ref('formdata',scoped);
});
Привет.
Я хочу сделать библиотеку с иконками. И вот, похоже, я наткнулся на проблему. Дерби позволяет грузить либо всю библиотеку целиком, либо создавать отдельный компонент для каждой иконки.
Здесь видно, как Натан вручную прописел каждый компонент. Мне бы хотелось сделать что-то типа:
icons.forEach(function(icon) {
app.component(require( "./icons/" + icon));
});
На сервере это работает, а на клиенте дает ошибку Error: Cannot find module './icons/air'
.
Как бы мне так сделать так, чтобы при подключении библиотеки я мог указывать какие именно иконки попадут в бандл? Оверхед больно уж велик...
Хочется реализовать страницу, половина которой будет отрисовываться с помощью derby, а вторая часть будет полностью сохранять свое состояние во время переходов между страницами. Могу ли я с этой целью перекрыть метод render класса Page, чтобы заменять html не всего элеметна body? Или лучше использовать какой-нибудь другой способ?
I need to modify model only on server side. How to forbid client side modifications to avert hackers?
Можно еще:
@app.model.method...
Разъясните мне, пожалуйста, такой нюанс. Можно ли в компоненте таким образом обращаться по remote пути, чтобы получить синхронизированный с db документ?
app.get('home', '/');
app.component('new', New)
function New() {};
New.prototype.create = function(model) {
var item = model.root.at('items.1');
model.subscribe(item, function (err) {
item.set({text: "Hello world"});
});
}
Расскажите пожалуйста как работают таймеры в Derbyjs и как правильно с ними работать. Как запустить таймер на сервере и на клиенте одновременно, как по отдельности, или там или там. Как правильно запустить таймер из реактивной функции на сервере. Буду благодарен за ответ.
В документации дерби есть пример, когда подписка на несколько запросов задается с помощью одной функции
model.subscribe(user, todosQuery, function(err)...
Сокращает ли такая форма записи количество запросов которые получит сервер?
That's the question.
Hello!
I need to pass a reference to a component as an event handler argument.
Template:
<index:>
<md-button class="md-button--raised" as="a">disabled</md-button>
<md-button class="md-button--raised md-button--warn" on-click="btnDisable(a)">warn</md-button>
Controller:
app.proto.btnDisable = (btn) ->
console.log btn # get undefined here
What am I doing wrong?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.