簡體   English   中英

如何從控制台或其他JS代碼中調用Meteor模板助手?

[英]How do you call a Meteor template helper from the console or other JS code?

我已經在Meteor中定義了一個模板助手

Template.postsList.helpers({
  filteredPosts: function getPosts() {
    return Posts.find(...);
  }
});

如何從控制台調試該模板幫助程序,以及如何從應用程序中的其他代碼重用它?

  1. 想要從應用程序中的其他位置調用幫助程序建議您應該在函數中將其分解。

  2. 要快速調試助手,請在客戶端控制台中對此進行評估:

     Template.postsList.__helpers.get('filteredPosts')(...parameters); 
  3. 有一個軟件包可能有助於調試模板和模板助手: prasad19sara:client-debugger

它沒有正式回答問題,但我想分享一種簡單的技術,該技術實際上可以解決您描述的大多數問題。

假設我們有一組幫助程序,我們希望它們能夠從您的應用程序的不同部分通過模板或直接從我們的javascript代碼進行訪問。 為此,我將有一個全局Helpers對象,可以在其中添加任意數量的函數,例如

Helpers.routeIs = function (name) {
  var current = Router.current();
  return current && current.route && current.route.getName() === name;
};

Helpers.year = function () {
  return moment().year();
};

這使得它們易於在整個代碼中訪問,並且也很容易測試。 但是我也想在我的空格鍵模板中使用它們,對嗎?

一個簡單的想法是創建一個單獨的全局助手,該全局助手將返回Helpers對象本身。

Template.registerHelper('$', function () {
  return Helpers;
});

這樣做的好處是,它將強制我在對“全局助手”的每個引用{{$.year}}加上$前綴,即{{$.year}}{{$.routeIs 'home'}} ,這使代碼很多更具可讀性。

不幸的是,該解決方案存在一個小問題。 考慮以下示例:

Helpers.fullName = function () {
  return this.firstName + ' ' + this.lastName;
};

問題是,如果我的助手將通過this訪問當前上下文,它將獲得Helpers對象本身而不是數據上下文,因此{{$.fullName}}將永遠無法正常工作。 但是,當然有一種解決方法:

Template.registerHelper('$', function () {
  return new Proxy(this);
});

function Proxy (context) {
  this.context = context;
}

// put this in a place when you're quite sure
// all the helpers are already defined

_.each(Helpers, function (helper, name) {
  Proxy.prototype[name] = function () {
    return helper.apply(this.context, arguments);
  };
});

編輯

我在這里添加了參考實現:

https://github.com/anticoders/meteor-helpers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM