Мифрил - Рендеринг динамического контента
Я пытаюсь выполнить рендеринг моих 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),
]);
}))
])
]),
});
В качестве альтернативы, мифрил имеет механизм рендеринга до завершения запросов веб-службы, что может быть уместно здесь.