用Angular比Swig更有效地解释route视图中的数据
More efficient way to interpret data from route in view with Angular over Swig?
我有一个JSON对象数组从我的Node路由传递到它各自的视图。例如:
res.render("path/to/view", { data: result, data2: result2 })
,其中result和result2都是JSON对象数组。在我看来,我在一个ng-init函数中使用它们,就像这样:({{}}指定swig,其中我已经将[[]]更改为指定Angular,所以在下面的例子中,我们在使用我定义的Angular init函数之前使用swig)
<div ng-init="init( {{ data|json }} )"> </div>
我应该说上面的例子工作得很好,但是当"数据"成为一个非常大的数据集时,那么多的时间花在swig部分-即将其转换为JSON(再次…?)就像我说的,"数据"已经是JSON的形式,但是当我从上面的swig部分删除JSON时,我得到一个[$parse:syntax]
错误,它给了我上面的行,但评估:
<div ng-init="init( [object Object],[object Object] )"> </div>
我已经尝试使用ng-init="init( [[ JSON.parse( {{ data }} ) ]] )"
的变化,以便我评估输出到JSON(即使输出已经是..?),但不能得到任何工作。
任何想法?也许我的语法错了?我不明白,因为"数据"是JSON当我把它传递给视图,但我不能把它直接传递到我的init函数没有得到语法错误。
将ng-init
调用的内容从视图中取出,并将其放入控制器或服务中。
不使用ng-init
的理由有很多,以至于Angular团队基本上建议你不要使用它:https://docs.angularjs.org/api/ng/directive/ngInit
更新strong>
我想我终于明白你想要做什么了,这叫做引导。您可以将数据嵌入视图服务器端,如下所示:
<script>
angular.module("app").constant("myBootstrap", {{ data.stringified }});
</script>
其中data.stringified
是您的字符串化数据。然后在Angular中,你可以将myBootstrap
作为常量注入到任何你想要的控制器中,就像$rootScope
一样,这样数据就可用了。
因此,虽然我不完全确定是什么导致它运行如此缓慢,但我已经找到了一个解决方案,尽管"黑客"可能更准确地描述它。我遇到的问题是Swig花了很长时间来模板我的数据,然后把它传递给init函数(我现在知道这是不好的做法;也就是说,使用ng-init来调用函数)。
我应该提醒未来的读者,我正在使用Node.js, Swig来做模板,Angular来处理MVC方面的事情。
查看上面的问题,看看我的代码之前是什么样子的(慢版本)。下面是我的解决方案:
<路由一边/em>
var rawSQLData = makeSQLCall();
var parsedAsJsonSQLData = parseData(rawSQLData);
var parsedDataAsString = JSON.stringify(parsedAsJsonSQLData);
res.render("path/to/view", { data: parsedDataAsString });