在SproutCore中引用具有复合URL的静态文件

时间:2011-11-16 10:30:50

标签: sproutcore sproutcore-2

我正在使用static_url来引用位于 resources 目录中的静态文件。这适用于文字URL字符串,但它不适用于使用变量构建的复合URL:

static_url(foo + '/' + bar)

SproutCore的预处理器忽略了这一点。

那么有没有办法引用带有复合URL的静态文件?或者,由于我正在处理一组有限的URL,在引用它之前是否必须引入每个复合URL?

1 个答案:

答案 0 :(得分: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设置为true或false来在运行时更改图像。

希望这有帮助。