首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用第三方npm jquery模块的自定义小部件

使用第三方npm jquery模块的自定义小部件
EN

Stack Overflow用户
提问于 2016-10-14 18:16:38
回答 1查看 336关注 0票数 0

在从文档中进行了更多的研究之后,看起来定制小部件似乎是实现我所需要的最好的方法:自动完成下拉列表,将文章/博客文章按标题加载到用户类型中(我选择了npm autocomplete,https://www.npmjs.com/package/jquery-autocomplete,因为我认为这个特性很容易实现,但是apos本身可能有一种更简单的方法)。

我遵循了有关小部件http://apostrophecms.org/docs/tutorials/getting-started/custom-widgets.html的教程中的说明,并认为我几乎已经将其连接起来,但是我没有看到呈现的搜索小部件(视图),相反,dom显示了一个空元素div class=“apos-class=”数据-apos-area=“”元素,这表明在将所有部件连接在一起之间缺少一块,但是我无法根据文档示例代码识别缺失的部分。

这是问题1,下面的代码中缺少什么来阻止search.html视图的加载?

app.js

代码语言:javascript
复制
 modules: {
    'search-widget': {}
 }

lib\模块\search-小部件\index.js

代码语言:javascript
复制
module.exports = {
  extend: 'apostrophe-widgets',
  label: 'SiteSearch',
  addFields: [{
        type: 'string',
        name: 'title',
        label: 'Title'
    },
    {
        type: 'string',
        name: 'url',
        label: 'Url'
    }
  ],
  construct: function(self, options) {

    //load third party styles and scripts?
    var superPushAssets = self.pushAssets;
       self.pushAssets = function() {
       superPushAssets();
       self.pushAsset('stylesheet', 'autocomplete', { when: 'always' });
       self.pushAsset('script', 'autocomplete', { when: 'always' })
     };

    //get the data
    self.pageBeforeSend = function(req, callback) {

        var criteria = [
            { "type": "apostrophe-blog" },
            { "published": true }
        ];
        criteria = { $and: criteria };

        self.apos.docs.find(req, criteria).sort({ title: 1 }).toArray(function(err, autocomplete) {
            if (err) {
                return callback(err);
            }
            //Can I do something like this to load the widget data?
            req.data.autocomplete = autocomplete;

            return callback(null);

        });
    }
}
};

lib\模块\search-小部件\view\search.html

代码语言:javascript
复制
<div id="custom-search-input">
    <div class="input-group col-md-12">
        <input type="text" class="form-control input-lg" id="site-search" placeholder="Search" />
        <span class="input-group-btn">
            <button class="btn btn-info btn-lg" type="button">
                <i class="glyphicon glyphicon-search"></i>
            </button>
       </span>
    </div>
</div>

lib\modules\apostrophe-pages\views\pages\home.html

代码语言:javascript
复制
  {% extends 'apostrophe-templates:layout.html' %} {% block bodyClass %}{{ super() }} home-page{% endblock %} {% block title %}Help Site: {{ data.page.title | e }}{% endblock %} {% block main %}
    <section id="promo" class="promo section offset-header">
        <div class="container text-center">
            <div class="row">
                <div class="col-md-offset-2 col-md-8 col-sm-6 col-xs-12">
                    <!--search widget-->
                    {{ apos.singleton(data.page, 'search', 'search-widget') }}
                </div>
            </div>
        </div>
    </section>

问题2是,在搜索-小部件\index.js构造函数中,这是加载将其呈现给dom并使用它所需的第三方资产的正确方式吗?

问题3是,在search.html中,我可以简单地使用data.page将数据发送到对象吗?

代码语言:javascript
复制
<div id="custom-search-input">
    <div class="input-group col-md-12">
        <input type="text" class="form-control input-lg" id="site-search" placeholder="Search" />
        <span class="input-group-btn">
            <button class="btn btn-info btn-lg" type="button">
                <i class="glyphicon glyphicon-search"></i>
        </button>
    </span>
    </div>
</div>
<script>  
 $(function() {
    $("#site-search").autocomplete({
            source: {{ data.autocomplete | json }}
        }); 
  });
</script>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-15 22:15:49

如你所知,我是彭克大街Apostrophe团队的负责人。

首先,提供小部件的模块应该有一个以"-widgets“结尾的名称,而不是”-widget“。它必须是复数的(映射模块是复数的)。这是因为将有一个模块实例来管理小部件的所有服务器端需求(这称为“单例模式”)。它不是“一个小部件”,它是一个管理这类小部件的模块。

第二,像现在这样向pageBeforeSend添加代码将始终运行它--不管这个页面是否包含小部件。从长远的角度来看,这并不是最佳表现。特别是因为你正在加载网站上的所有博客文章。事情会很快减缓的。

我强烈建议您查看撇号-twitter-小部件模块及其源代码。除其他外,该模块实现了服务器端的Express路由,专门用于向小部件提供数据,何时以及是否在页面上实际存在小部件的实例,并且它希望知道。它实现了一个“小部件播放器”,这是一个在浏览器端调用的方法,如果页面上有这种小部件的话。

该模块还包含一些自定义浏览器端资产并正确地推送它们,这也将回答我在这个问题的下面看到的一些问题。

但是,请注意,正如发生的那样,Apostrophe一直将jquery自动完成推送到浏览器。这恰好是我们用于联接和标记的自动完成实现。所以你不用担心会把那笔资产推出去。

您的服务器端路由应该调用autocomplete游标过滤器,而不是一直获取世界上的所有内容。(撇号使用了很多自动完成,因此它已经为以智能和良好实现的方式获取与前缀匹配的内容提供了方便。

如果您不清楚游标过滤器,请确保在使用模型层时阅读HOWTO。

此外,始终使用适当模块的find方法,不要重新发明它,并试图自己找出什么使博客文章适合返回。

你的路线看起来可能是:

代码语言:javascript
复制
// Inside the construct function of your module...

self.route('get', 'autocomplete', function(req, res) {
  return self.apos.docs.getManager('apostrophe-blog')
    .find()
    .autocomplete(req.query.term)
    .limit(10)
    .projection({
      areas: false,
      joins: false
    })
    .toArray(function(err, posts) {
      if (err) {
        res.statusCode = 500;
        return res.send('error');
      }
      return res.send(_.map(posts, function(post) {
        return {
          value: post._url,
          label: post.title
        }
      }));
    }
  );
});

这将在模块的construct函数中进行。

现在有一条GET方法快车在/modules/search-widgets/autocomplete等您的消息。通过在浏览器端编写一个player方法来完成这项工作。您可以看到这些代码的外观,以及将它们放在apostrophe-twitter-widgets代码中的位置。当然,您将在小部件模板中的文本输入字段上调用.autocomplete()。并将jquery自动完成source选项设置为/modules/search-widgets/autocomplete

希望这能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40049651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档