Ссылки на статические файлы с составными URL-адресами в SproutCore
Я использую static_url
для ссылки на статические файлы, которые находятся в каталоге ресурсов. Это хорошо работает, когда для буквенных строк URL, но не работает для составных URL, которые были созданы с использованием переменных:
static_url(foo + '/' + bar)
Это просто игнорируется препроцессором SproutCore.
Так есть ли способ сослаться на статический файл с составным URL? Или, поскольку я работаю с конечным набором URL-адресов, нужно ли вводить каждый составной URL-адрес, прежде чем я смогу на него ссылаться?
1 ответ
Этот ответ предполагает, что вы используете SC1.
я полагаю, что static_url()
обрабатывается инструментами сборки (sc-build и sc-server) во время компиляции, а не инфраструктурой во время выполнения.
Код для инструментов сборки можно найти по адресу https://github.com/sproutcore/abbot. я верю base.rb replace_static_url()
это где работа сделана.
Итак, следующий код:
imageView: SC.ImageView.design({
layout: { top: 0, left: 0, width: 200, height: 18 },
value: static_url('picture.png')
})
перед компиляцией в браузер компилируется в следующее:
imageView: SC.ImageView.design({
layout: { top: 0, left: 0, width: 200, height: 18 },
value: '/static/vvv/en/current/source/resources/picture.png?1320555999'
})
Чтобы создать составной URL во время выполнения, попробуйте использовать привязки.
// In your view
imageView: SC.ImageView.design({
layout: { top: 0, left: 0, width: 200, height: 18 },
valueBinding: 'Vvv.controller.imageValue'
})
// In another file, define the controller
Vvv.controller = SC.Object.create({
foo: '/static/vvv/en/current/source/resources',
bar: 'bug.png',
imageValue: function() {
return this.get('foo') + '/' + this.get('bar');
}.property().cacheable()
});
Кроме того, если у вас есть ограниченный набор ресурсов, вы можете попробовать это:
Vvv.controller = SC.Object.create({
foo: static_url('foo.png'),
bar: static_url('bar.png'),
isFoo: false,
imageValue: function() {
if (this.get('isFoo')) {
return this.get('foo');
} else {
return this.get('bar');
}
}.property('isFoo').cacheable()
});
Вы можете изменить изображение во время выполнения, установив isFoo
на истину или ложь.
Надеюсь это поможет.