所以,为了适当地构建它,我在这里继承了一个代码库,我对角度没有深入的了解。基本上,有一个应用程序根据数据库导入是否已完成显示或隐藏加载gif。
出于某种原因,尽管数据集导入已完成,但角度无法识别它。下面简化的代码示例:
<h4>Status
<small ng-hide="dataset.failed">{{ dataset.status }}</small>
<img class="pull-right" ng-hide="(dataset.import_complete || dataset.failed)" src="/url" height="12">
</h4>
<span>{{ dataset.import_complete }}</span>
我添加的范围用于调试目的,但基本上跨度显示True
,而上面的img
标记仍在显示。这意味着,角度正在评估dataset.import_complete || dataset.failed
到False
。
为什么会这样?任何帮助调试此行为的建议都将非常受欢迎。
更新: 我认为这里的想法是在这里发生了一些错误的类型检查。具体来说,以下情况似乎是正确的:
# Always evaluates to True, regardless of import_complete
dataset.import_complete == True
# Always evaluates to False, again, regardless of import_complete
dataset.import_complete == 'True'
# result is bool, as it should be, making this only more baffling
type(dataset)
此外,这里有一些后端,但可能不是很有帮助:
@route(bp, '/dataset/<int:dataset_id>', methods=["GET", "POST"])
def数据集(dataset_id): msgstr“”“返回数据集管理页面”“”
dataset = Dataset.query.get_or_404(dataset_id)
return render_template(
'manage/dataset.html',
dataset=dataset,
)
有关详细信息,请输入vars(dataset)
:
{'import_complete': True, 'failed': False, 'pending_deletion': False}
答案 0 :(得分:1)
不要忘记Jinja和Angular都使用相同的{{
和}}
令牌作为语法。
在我看来,你正在使用Jinja来渲染HTML,如果HTML也包含你的AngularJS代码,那么在AngularJS运行之前,{{ expr }}
会被Flask / Jinja插值浏览器。
我的猜测是您在HTML中看到的True
,来自 Jinja2呈现此表达式(不是Angular)
<span>{{ dataset.import_complete }}</span>
并且至少键 import_complete
在您的Angular应用的$ scope中的undefined
JS对象中是dataset
。 (因为someObject.undefinedKey == 'True'
会给出JS布尔false
)
{ng}应用中可能存在$scope.dataset
对象,但似乎$scope.dataset
包含密钥import_complete
(ng-hide="dataset.import_complete"
无效,你明确需要明确定义$scope.dataset.import_complete
要确认它是实际上呈现上述内容的Jinja2,请尝试通过curl
或wget
保存来查看HTML,您应该看到它没有<span>{{ dataset.import_complete }}</span>
1}}在NG的静态HTML中运行,但<span>True</span>
如果是这样,那么try adapting more structured way this to your project, by separating the server/API and the client
否则为了快速解决问题,您可以change the tokens for your angular app to something else,然后弄清楚如何将变量放入$scope
(例如,在Jinja中渲染$scope.dataset = {{dataset_json}};
以获取它进入JS,a 黑客,你想长期避免)
如果此<span>{{ dataset.import_complete }}</span>
显示True
作为输出,则表明密钥import_complete
实际上包含一个值为"True"
的字符串,而不是JS布尔true
我重新审核你的评论,你说你试图无济于事
ng-hide="dataset.import_complete == 'True'"
这似乎有可能,但我对如何调试它感到茫然。
所以我建议你研究dataset
对象的值,比如这个
<p>{{dataset}}</p>
或者<p>{{dataset | json}}</p>
,那么你可以确定它的价值和类型
您还可以查看浏览器的开发工具网络标签,了解Flask后端发送回AngularJS的内容。