2016-03-16 3 views
0

Этот код Метеор пытается вернуть курсор во встроенные документы, на которые ссылается поле data, а затем проверяет, существует ли он (потому что иногда он не существует в ActiveTaskCol), прежде чем возвращать этот вспомогательный метод шаблона.Возвращает встроенный документ из коллекции find

добавлены позже
Ожидаемый возвращен курсор будет использоваться в HTML {{данных #each}} для получения дополнительной работы, следовательно, использование .find вместо .findOne.

Проблема заключается в том, что если оператор имеет значение истинно, даже если нет data поле в ActiveTaskCol, я также попытался obj.count() > 0, который также верно, даже если поле «данные» не существует в коллекции.
Как я могу это исправить? Благодаря

Template.index.helpers({ 
    taskInputs: function() { 
     var ready = Meteor.subscribe('inputsCol').ready(); 
     var data = InputsCol.find({}); 

     var selectedTask = Session.get('taskSelected'); 
     var obj = ActiveTaskCol.find({action: selectedTask}, {field: {data: 1}}); 
     if (typeof obj != 'undefined') { //<-always true -------------- 
      return {items: obj}; 
     } else { 
      return {items: data, ready: ready}; 
     } 
    } 
}); 

ответ

1

Это всегда верно, потому что, вы используете find, который возвращает курсор. Вместо этого вы должны использовать findOne, чтобы он возвращал документ или не определен, если такого документа нет. Я также предлагаю, вы используете obj, который проверяет falsy значений как undefined, null, false вместо typeof obj != 'undefined'

Template.index.helpers({ 
    taskInputs: function() { 
     var ready = Meteor.subscribe('inputsCol').ready(); 
     var data = InputsCol.find({}); 

     var selectedTask = Session.get('taskSelected'); 
     var obj = ActiveTaskCol.findOne({action: selectedTask}, {field: {data: 1}}); 
     if (obj) { 
      return {items: obj}; 
     } else { 
      return {items: data, ready: ready}; 
     } 
    } 
}); 

Update: на основе ваших комментариев, вы можете использовать obj.count(), чтобы проверить, есть ли документы соответствия ваши критерии.

Template.index.helpers({ 
    taskInputs: function() { 
     var ready = Meteor.subscribe('inputsCol').ready(); 
     var data = InputsCol.find({}); 

     var selectedTask = Session.get('taskSelected'); 
     var obj = ActiveTaskCol.find({action: selectedTask}, {field: {data: 1}}); 
     if (obj.count() > 0) { 
      return {items: obj}; 
     } else { 
      return {items: data, ready: ready}; 
     } 
    } 
}); 

Update 2

Template.index.helpers({ 
    taskInputs: function() { 
     var ready = Meteor.subscribe('inputsCol').ready(); 
     var data = InputsCol.find({}); 

     var selectedTask = Session.get('taskSelected'); 
     var obj = ActiveTaskCol.find({ 
      action: selectedTask, 
      data: { $exists: true } 
     }, { 
      field: {data: 1} 
     }); 
     if (obj.count() > 0) { 
      return {items: obj}; 
     } else { 
      return {items: data, ready: ready}; 
     } 
    } 
}); 
+0

Поскольку мне нужно вернуть {пункты: OBJ}, если поле данных существует, вы имели в виду, если (объект), так что будет гарантировать, что это не (неопределенный, нулевой , ложный)? вместо того, что вы набрали, если (! obj)? thx –

+0

Вы правы. Извини за это. – Kishor

+0

Причина, по которой я использовал find вместо findOne, заключается в том, что мне нужен помощник шаблона, чтобы вернуть курсор, чтобы использовать html-шаблон {{#each data}}. Кроме того, мне нужно получить курсор для встроенного документа, на который ссылаются поле «данные», а не документ верхнего уровня. постскриптум thx для быстрого исправления! obj :) –

Смежные вопросы