Одна идея состоит в том, чтобы использовать манипуляции с DOM, что не является наиболее рекомендуемым способом Angular, но я получил его, работая над этим плункером. и второй с пользовательскими директивами и рандомизированными данными для имитации вашего скомпилированного аватара.
Чтобы имитировать ваш асинхронный вызов, я использую ngResource. Моя функция рендеринга возвращает строку "<div class='compiledavatar'>Temporary Avatar</div>"
со специальной разметкой класса compiledavatar
. На секунду или две вы увидите временный аватар при выборе элемента. Когда вызовы ngResource заканчиваются, я ищу элемент с классом compiledavatar
, а затем заменяю html тем, что скачал. Вот полный код:
var app = angular.module('plunker', ['selectize', 'ngResource']);
app.controller('MainCtrl', function($scope, $resource, $document) {
var vm = this;
vm.name = 'World';
vm.$resource = $resource;
vm.myModel = 1;
vm.$document = $document;
vm.myOptions = [{
id: 1,
title: 'Spectrometer'
}, {
id: 2,
title: 'Star Chart'
}, {
id: 3,
title: 'Laser Pointer'
}];
vm.myConfig = {
create: true,
valueField: 'id',
labelField: 'title',
delimiter: '|',
placeholder: 'Pick something',
onInitialize: function(selectize) {
// receives the selectize object as an argument
},
render: {
item: function(item, escape) {
var label = item.title;
var caption = item.id;
var Stub = vm.$resource('mydata', {});
// This simulates your asynchronous call
Stub.get().$promise.then(function(s) {
var result = document.getElementsByClassName("compiledavatar")
angular.element(result).html(s.compiledAvatar);
// Once the work is done, remove the class so next time this element wont be changed
// Remove class
var elems = document.querySelectorAll(".compiledavatar");
[].forEach.call(elems, function(el) {
el.className = el.className.replace(/compiledavatar/, "");
});
});
return "<div class='compiledavatar'>Temporary Avatar</div>"
}
},
// maxItems: 1
};
});
Чтобы имитировать JSON API, я только что создал файл в plunker mydata
:
{
"compiledAvatar": "<div><span style='display: block; color: black; font-size: 14px;'>an avatar</span></div>"
}
Конечно, ваша скомпилированная функция должна возвращать вам что-то другое при каждом вызове. Мне это дает то же самое, чтобы продемонстрировать принцип.
Кроме того, если ваш динамический код является директивой Agular, вот второй планкер с пользовательской директивой и случайным образом данные, чтобы вы могли лучше увидеть решение:
Данные включают пользовательскую директиву my-customer
:
[{
"compiledAvatar": "<div><span style='display: block; color: black; font-size: 14px;'>an avatar #1 <my-customer></my-customer></span></div>"
},
{
"compiledAvatar": "<div><span style='display: block; color: black; font-size: 14px;'>an avatar #2 <my-customer></my-customer></span></div>"
},
(...)
Директива определяется как:
app.directive('myCustomer', function() {
return {
template: '<div>and a custom directive</div>'
};
});
И основное отличие приложения в том, что при замене HTML нужно добавить $compile и текст должен показывать An avatar #(number) and a custom directive
. Я получаю массив значений json и использую простой случайный выбор для выбора значения. После замены HTML я удаляю класс, поэтому в следующий раз будет изменен только последний добавленный элемент.
Stub.query().$promise.then(function(s) {
var index = Math.floor(Math.random() * 10);
var result = document.getElementsByClassName("compiledavatar")
angular.element(result).html($compile(s[index].compiledAvatar)($scope));
// Remove class
var elems = document.querySelectorAll(".compiledavatar");
[].forEach.call(elems, function(el) {
el.className = el.className.replace(/compiledavatar/, "");
});
});
Кроме того, я просмотрел библиотеку selectize, и вы не можете вернуть обещание... как это делает html.replace для значения, возвращаемого рендером. Вот почему я пошел по пути временной строки с классом, чтобы получить его позже и обновить. Дайте мне знать, если это поможет.
person
Gregori
schedule
06.07.2016
render.item
должна возвращать htmlstring
, а не обещание. Пожалуйста, поделитесь идеями о том, как использовать обещания для этой проблемы. Спасибо! - person atfornes   schedule 01.07.2016