2016-10-12 8 views
1

Say Я использую JS методу, которые имеют «этого» возвращенные, таким образом, можно церь такие:Как связать методы JavaScript изначально с итератора?

something.add({a: 'xyz', b: 123}).add({a: 'abc', b: 456}); 

Как я могу цепные их на что-то из итератора? Например:

$scope.bindings = [ 
    { 
      key: 'up', 
      func: function() { 
       $scope.scroll(1) 
      } 
     },{ 
      key: 'down', 
      func: function() { 
       $scope.scroll(-1); 
      } 
     }, 
]; 

--- EDIT ---

Библиотека Я использую это Angular hotkeys. Я хотел попросить в общем случае помочь кому-либо еще в подобном положении.

у меня есть:

var hotBindings = hotkeys.bindTo(scope); 


    for (var bind of scope.bindings) { 
     hotBindings = hotBindings.add({ 
     combo: bind.key, 
     callback: function(e) { 
      e.preventDefault(); 
      bind.func(); 
     } 
     }) 
} 

Это присваивает 'вниз' метод как нажатиями. Если я выпишу код без цикла, используя scope.bindings [index] .key (например) и связать метод .add(), то он работает. Я также пробовал без «hotBindings =».

Пожалуйста, не упоминайте область scopve vs $, поскольку это передается в функцию связи в угловой директиве - угловой почти наверняка не имеет к этому никакого отношения.

+0

я не уверен, чтобы понять, что вы хотите здесь ... –

+0

Попробую поставить codepen вместе позже сегодня, когда у меня есть время, я знаю, это немного абстрактно –

+0

Это не дубликат, я уже сказал, что «это» возвращается для создания цепей. –

ответ

1

Единственная проблема, я вижу, не работает for (var bind of bindings).

Редактировать: думал, что это как-то связано с синтаксисом for (var bind of bindings) и var v.s. let, получается, что предоставленный код просто работает. Я удалю этот ответ, если возникнет реальная проблема. Должно быть в классе Something?

Все, кажется, работает:

var Something = function() { 
 
    this.data = []; 
 
    this.add = function(item) { 
 
    this.data.push(item); 
 
    return this; 
 
    }.bind(this); 
 
}; 
 

 
var bindings = [{ 
 
    x: 'hi', 
 
    func: function() { 
 
    console.log("hi"); 
 
    } 
 
}, { 
 
    x: 'bye', 
 
    func: function() { 
 
    console.log("bye"); 
 
    } 
 
}]; 
 

 
var something = new Something(); 
 

 
for (var bind of bindings) { 
 
    something.add({ 
 
    x: bind.x, 
 
    callback: bind.func 
 
    }) 
 
}; 
 

 
console.log(something.data);

+0

Я попытался использовать 'for..of', он все еще работает. –

+0

@ RaxWeber спасибо, что указал. Оказывается, все работает так, как ожидалось?Бен, может быть, это реализация метода «Something.add»? – user3297291

+0

Я посмотрел в источник, и он возвращает «это», как и ожидалось. https://github.com/chieffancypants/angular-hotkeys/blob/master/src/hotkeys.js#L538. Обновлен мой вопрос –

1

Я не уверен, что SomeThing или что это add метод возвращает, но вы можете повторить цепное, делая

let something = new Something(); 
for (const bind of bindings) { 
    something = something.add({ 
     x: bind.x, 
     callback: bind.func 
    }); 
} 
+0

Если Somethign был угловой фабрикой, что бы вы предложили? –

+0

Это зависит от конкретной фабрики. В любом случае, если работает цепочка '.add (...) .add (...). ...', это решение также будет работать. – Bergi

1

Если вы делаете это много (возможно, используя разные методы th просто «добавить»), вы могли бы рассмотреть возможность использования вспомогательной функции:

function chain(obj, ...calls) { 
    for(let {method, args} of calls) { 
    obj = obj[method](...args) 
    } 
    return obj 
} 
chain(new Somthing(), [ 
    {meth: 'add', args: [ 
    {x: 'hi', func:() => console.log('hi')}]}, 
    {meth: 'add', args: [ 
    {x: 'bye', func:() => console.log('bye')}]} 
    ]}) 

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

  • Нет связанных вопросов^_^