Python和angang在变量值上存在分歧
Python and angular disagree on variable value
所以,为了恰当地构建这一点,我在这里继承了一个代码库,我对角度没有深入的了解。基本上,有一个应用程序根据数据库导入是否已完成来显示或隐藏加载 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"])
定义数据集(dataset_id(: ""返回数据集管理页面"">
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}
在 NG 运行之前,您的表达式是否被 Jinja2 插值?
不要忘记Jinja和Angular都使用相同的{{
和}}
令牌作为语法。
在我看来,你正在使用Jinja来渲染那个HTML,如果那个HTML也包含你的AngularJS代码,那么在AngularJS在浏览器上运行之前,{{ expr }}
会被Flask/Jinja
我的猜测是你在HTML中看到的True
,来自Jinja2渲染这个表达式(不是Angular(
<span>{{ dataset.import_complete }}</span>
而且至少关键import_complete
undefined
在 Angular 应用程序$scope的 dataset
JS 对象中。(因为someObject.undefinedKey == 'True'
会给JS布尔false
(
$scope.dataset
对象很可能存在于您的ng应用程序中,但似乎$scope.dataset
不包含键import_complete
(要使ng-hide="dataset.import_complete"
工作,您需要$scope.dataset.import_complete
明确定义(
如何检查?
要确认实际上是 Jinja2 渲染了上述内容,请尝试通过保存 curl
或 wget
来查看 HTML,您应该看到它在静态 HTML 中没有带有 <span>{{ dataset.import_complete }}</span>
供 NG 运行,而是带有<span>True</span>
如何修复
如果这是真的,那么尝试通过分离服务器/API 和客户端来适应你的项目,以更结构化的方式适应你的项目
否则,为了快速修复,您可以将角度应用程序的令牌更改为其他内容,然后弄清楚如何将变量放入您的$scope
(例如,在 Jinja 中渲染$scope.dataset = {{dataset_json}};
以将其放入 JS,从长远来看,您希望避免的黑客攻击(
调试
如果此<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 的内容。
- JavaScript:单击时相对于父级增加变量值
- 如何通过ajax增加/减少PHP变量值并重新加载函数
- 如何从特定页面中提取php变量值
- JavaScript模数未正确递增变量值
- 替换另一个变量对象中的变量值
- mandrill合并标记不接受变量值
- 将变量值从一个javascript传递到另一个javascript
- 如何将变量值附加到另一个变量
- html类名中的数字形式的Javascript变量值
- 如何在C#中获取Javascript变量值
- 如何将C#变量值传递给javascript以使用amcharts
- 正在从addEventListener中获取变量值
- 使用变量值作为'名称标识符'javascript/html
- 为什么在以下代码段中无法访问中的变量值
- 我们可以在初始化variable Angular JS时将变量值声明为未定义吗
- 在HTML/Javascript文件中获取App Inventor 2变量值
- 将变量值传递给另一个函数
- Python和angang在变量值上存在分歧
- 与变量值同名的函数存在,但是接收到typeError,为什么?
- 如何获得(调用)动态生成的变量值保存在(mysql)数据库使用php