2016-09-19 2 views
2

У меня есть компонент MITHRIL с контроллером, который уже ограниченный в контекст, если я использую m.component(), мифрили пренебрегает ограниченный контроллер и выдают вид с умолчанием пустого контроллеракомпонентов мифриловых - ограниченные контроллеры

UserWidget = function(){ 
    this.allUsers = User.load(); 
    this['header'] = {  
    'controller' : function(users){ 
     this.users = users; 
    }.bind(this, this.allUsers), 
    'view' : function(ctrl) { 
     console.log('ctrl', ctrl) 
     if (ctrl.users()) { 
     return m('.user', ctrl.users()[0].name()); 
     } 
    } 
    } 
} 

//initialize 
m.module(document.body, m(new UserWidget().header)); 

Однако, если я прохожу вид/контроллер через m.module все работает, как ожидалось

m.module(document.body, new UserWidget().header); 

https://jsfiddle.net/chifer/mwddffy4/2/

I s это предупреждение о том, что контроллеры компонентов должны быть неограниченными и переданы параметрами через вызов m.component? или это ошибка?

ответ

1

Является ли предостережением, что контроллеры компонентов должны быть неограниченными и переданы параметрами через вызов m.component?

Да. Контроллеры вызывается как конструкторы с ключевым словом new, что означает, что this (и аргументы, переданные в) не могут быть привязаны к нему.

Ваш код может быть упрощен, избегая this и связывания внутренне:

UserWidget = function(){ 
    var users = User.load(); 

    return { 
    'view' : function() { 
     if (users()) 
     return m('.user', users()[0].name()); 
    } 
    } 
} 

//initialize 
m.module(document.body, m(UserWidget())); 

Fiddle here.

Но на практике этого кода тиражирование функциональности, которая уже встроена в контроллеры - цитата из the Mithril API documentation for components:

Опциональная функция контроллера создает объект, который может быть использован в следующих рекомендуемых способах:

[...]

  • Он может хранить контекстные данные, возвращаемые из модельных методов (т.е. promise от request).
  • Он может содержать ссылку на модель представления.

В принципе, исходный код приложения включает в себя конструктор, который делает запрос и сохраняет ссылку на возвращаемом обещание, и это именно то, что контроллеры для. Таким образом, вы можете избежать написания каких-либо посреднических функций или конструкторы самостоятельно и запекать всю эту функциональность в самой компонентной структуры:

UserWidget = { 
    'controller' : function(){ 
    this.users = User.load(); 
    }, 
    'view' : function(ctrl) { 
    if (ctrl.users()) 
     return m('.user', ctrl.users()[0].name()); 
    } 
} 

//initialize 
m.module(document.body, UserWidget); 

Fiddle here.

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