Angular 2 Renderer2 - 它是如何工作的

时间:2017-09-01 07:11:18

标签: angular dependency-injection angular2-directives

我试图理解在指令中添加renderer2修饰或在角度2中添加组件的必要性。

来自documentaion:renderer 2 documentaion 他们没有提供锄头工作的例子。任何人都可以用完整的例子解释。请

1 个答案:

答案 0 :(得分:4)

import numpy as np import matplotlib.pyplot as plt def autolabel(rects): """ Attach a text label above each bar displaying its height """ for rect in rects: height = rect.get_height() ax.text(rect.get_x() + rect.get_width()/2., height, '%d' % int(height), ha='center', va='bottom') methods =[{"name": 'name1', "score": 89.2, "year":2016, "dtype": 'type1'}, {"name": 'name2', "score": 95.54, "year":2017, "dtype": 'type2'}, {"name": 'name3', "score": 85, "year":2016, "dtype": 'type1'}, {"name": 'name4', "score": 86, "year":2015, "dtype": 'type1'}, ] pub_years = np.unique([method["year"] for method in methods]) dtypes = np.unique([method["dtype"] for method in methods]) n_years = len(pub_years) n_dtypes = len(dtypes) offset = np.zeros([n_years, n_dtypes]) width = 0.2 spacing = 0.01 color_list = plt.cm.Set3(np.linspace(0, 1, n_dtypes)) # colors = {'type1':'b', 'type2':'g'} colors = {dtype: color_list[i] for i, dtype in enumerate(dtypes)} legend_bars = [] fig, ax = plt.subplots() for m in methods: i = int(np.squeeze(np.where(pub_years==m['year']))) j = int(np.squeeze([i for i, type in enumerate(dtypes) if type == m['dtype']])) x = m["year"] + offset[i][j] rect = ax.bar(x, m['score'], color=colors[m['dtype']], width=width) autolabel(rect) if offset[i][j]==0: legend_bars.append(rect) offset[i][j] = offset[i][j] + width + spacing # add some text for labels, title and axes ticks ax.set_ylabel('Accuracy') ax.set_xlabel('Year of Publication') ax.set_yticks(np.arange(0,105,5)) ax.set_ylim([0, 105]) ax.set_xticks(pub_years) ax.set_xticklabels(pub_years) ax.set_xlim([np.min(pub_years)- 1, np.max(pub_years) + 1]) ax.legend(legend_bars, dtypes) plt.show() 只是一种抽象。 如果使用Universal(服务器端呈现)或WebWorkers,则没有可用的DOM,直接访问DOM的代码只会导致异常。

如果使用Renderer2,Angular可以使用其依赖注入功能提供不同的实现,以使您的代码使用与当前运行代码的平台兼容的实现。

Renderer2非常有限,因为所有方法都只允许更新DOM,但没有人允许读取来自DOM的任何信息。 如果您确实需要阅读,则需要采取特殊措施使其与Universal或WebWorker一起使用(例如,检查当前平台并跳过直接访问DOM的代码的执行,如果它不是浏览器平台,或者使用当前平台提供的其他人员