Может обработчик событий, определенный в самом доступе литерала объектов JavaScript?

//Employee Documents
/* 1 */
{
    "_id" : ObjectId("5c41aaa91d0b034e617effc0"),
    "emp_id" : 1
}

/* 2 */
{
    "_id" : ObjectId("5c41aaec1d0b034e617f0001"),
    "emp_id" : 2
}

/* 3 */
{
    "_id" : ObjectId("5c41aaf31d0b034e617f0009"),
    "emp_id" : 3
}

//Salary Documents:
{
    "_id" : ObjectId("5c41aac01d0b034e617effd4"),
    "emp_id" : 1,
    "salary" : 1000
}
**//Query**
db.employee.aggregate([
    {
        $lookup:{
            from: "salary",
            localField: "emp_id", //reference of employee collection
            foreignField: "emp_id",  //reference of salary collection
            as: "sal"
         }
    },{
       $unwind: {
             path: "$sal",
            preserveNullAndEmptyArrays: true //will return null if salary does not exist
        }
      },{
         $project:{
             emp_id: 1,
             salary:  { $ifNull: [ "$sal.salary", 0 ] } //will set to 0 if salary does not exist
             }  
       }]);

//Output
/* 1 */
{
    "_id" : ObjectId("5c41aaa91d0b034e617effc0"),
    "emp_id" : 1,
    "salary" : 1000
}

/* 2 */
{
    "_id" : ObjectId("5c41aaec1d0b034e617f0001"),
    "emp_id" : 2,
    "salary" : 0.0
}

/* 3 */
{
    "_id" : ObjectId("5c41aaf31d0b034e617f0009"),
    "emp_id" : 3,
    "salary" : 0.0
}
6
задан 20 November 2008 в 17:28
поделиться

3 ответа

Самый простой способ связать вызов с handle_click к объекту это определяется в, было бы что-то вроде этого:

        var self=this;
        document.getElementById('x').onclick = 
           function(e) { return self.handle_click(e) };

Если необходимо передать в параметрах или хотеть заставить код выглядеть более чистым (например, при установке большого количества подобных обработчиков событий) Вы могли бы использовать приправляющую карри технику для достижения того же:

bind : function(fn)
{
   var self = this;
   // copy arguments into local array
   var args = Array.prototype.slice.call(arguments, 0); 
   // returned function replaces first argument with event arg,
   // calls fn with composite arguments
   return function(e) { args[0] = e; return fn.apply(self, args); };
},

...

        document.getElementById('x').onclick = this.bind(this.handle_click, 
           "this parameter is passed to handle_click()",
           "as is this one");
3
ответ дан 17 December 2019 в 02:35
поделиться

Так, часть обработчика событий обеспечивает электричеством очень хорошо (я протестировал ее сам), но, как Ваш комментарий указывает, у Вас нет доступа к "y" свойству объекта, который Вы просто определили.

Это работает:

var object = { 
  y : 1, 
  handle_click : function (e) {
    alert('handling click');

    //want to access y here 
    alert(this.y); 

    return false; 
  }, 
  load : function () { 
    var that = this; 
    document.getElementById('x').onclick = function(e) {
      that.handle_click(e); // pass-through the event object
    }; 
  } 
}; 
object.load();

Существуют другие способы сделать это также, но это работает.

3
ответ дан 17 December 2019 в 02:35
поделиться

Я вижу, как сделать это с последним Jason. Какой-либо способ сделать это без анонимной функции?

0
ответ дан 17 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: