Мифрил - Рендеринг динамического контента

Я пытаюсь выполнить рендеринг моих DOM elemnets после того, как мой отложенный объект возвращается с данными. Я отлаживаю это на консоли, и кажется, что мои элементы создаются, однако это никогда не отображается на странице. Если я добавлю статический контент, он будет работать как задумано.

        m('div', {class: 'table-responsive'}, [
            m('table', {class: 'table'}, [
                m("thead", [
                    m('tr', [
                        m('th', '#'),
                        m('th', 'Groups'),
                    ])
                ]),
                m('tbody', findGroupsDeferred.promise.then(function(data){ // findGroupsDeferred returns when the promise is complete with my data.
                    data.group.map(function(group) {
                        return m("tr", [
                            m("td", [
                                m("input[type=checkbox] checked", {
                                    value: group,
                                    onclick: function (event) {
                                        if (event.target.checked) {
                                            ctrl.addGroup(ctrl.groups(event.target.value))
                                        } else {
                                            ctrl.removeGroup(ctrl.groups(event.target.value))
                                        }
                                    }
                                })
                            ]),
                            m("td", group),
                        ])
                    });
                }))
            ])
        ]),

2 ответа

Roamer-1888 Совершенно верно. Это не может быть сделано в представлении. У вас есть несколько вариантов для достижения этой цели:

Сначала нужно дождаться результата в контроллере:

controller: function() {
  scope = {
    groups: []
  }
  findGroupsDeferred.promise.then(function(data) {
    scope.groups = data.group;
  }
  return scope;
},
view: function(scope) {
  return scope.groups.map(function(group) {
    return group.name // or what ever you want to do here
  }
}

Другой вариант - создать для этого компонент, который в значительной степени приводит к тому же коду, который принимает его инкапсулированный. Третий вариант заключается в использовании m.prop вместе с мифрилами побеждал за это.

Я не знаю мифрила, но думаю, что обещание не может быть использовано таким образом.

Исходя из первых принципов обещаний, было бы более разумно m() выражение с promise.then(...), Другими словами, построить всю таблицу после findGroupsDeferred.promise разрешает, а не пытается нацелиться на внутреннюю часть таблицы.

findGroupsDeferred.promise.then(function(data) { // findGroupsDeferred returns when the promise is complete with my data.
    m('div', {class: 'table-responsive'}, [
        m('table', {class: 'table'}, [
            m("thead", [
                m('tr', [
                    m('th', '#'),
                    m('th', 'Groups'),
                ])
            ]),
            m('tbody', data.group.map(function(group) {
                return m("tr", [
                    m("td", [
                        m("input[type=checkbox] checked", {
                            value: group,
                            onclick: function (event) {
                                if (event.target.checked) {
                                    ctrl.addGroup(ctrl.groups(event.target.value));
                                } else {
                                    ctrl.removeGroup(ctrl.groups(event.target.value));
                                }
                            }
                        })
                    ]),
                    m("td", group),
                ]);
            }))
        ])
    ]),
});

В качестве альтернативы, мифрил имеет механизм рендеринга до завершения запросов веб-службы, что может быть уместно здесь.

Другие вопросы по тегам