我正在尝试编写一个指令来解决承诺并将数据添加到作用域,以便我可以懒惰地将数据从API加载到子元素中。如何将数据从父元素的指令传递给子元素?
通过console.logging我确定我正在解决承诺并获取我的预期数据,但页面上没有任何更新。我假设从指令内动态添加到范围导致我的问题。
的指令似乎相当琐碎的,我知道这个承诺是越来越解析:
app.directive('resolver',() => {
return {
restrict: "AEC",
scope: {
outName: "@",
promise: "&",
defaultVal: "="
},
link: function ($scope, element, attrs) {
var promise = $scope.promise,
outName = $scope.outName || 'myPromise',
defaultVal = $scope.defaultVal || {};
$scope[outName] = defaultVal;
promise().then(data => {
$scope[outName] = data;
});
}
}
});
我希望这将让我做类似如下:
<li class="company-entry" ng-repeat="company in currentFeed.companies" resolver promise="getPreview(company.companyId)" out-name="profile" default-val="{name:'Loading...',description:'',images:[],sources:[]}">
...
<a ui-sref="company.feed({ id: company.companyId })" class="company-name">{{ profile.name || 'foo' }}</a>
</li>
首先,我有profile.name || 'foo'
为了测试我的代码的默认值部分是否会工作;因为它保持在foo,所以即使默认值被放入profile
。
其次,承诺解决后,我应该设置profile
的数据,但页面不更新。
添加一个$scope.$apply()
会导致我得到rootcope更新已在进行中的错误。
有什么办法可以完成我想要做的事情吗?
那么,我试图将它建立到指令的原因是因为我基本上有大量的位置,我想要根据关于该条目的特定特征来拉下相关数据;在这种情况下,我希望从仅具有公司ID的位置下载公司预览,而不要将该预览注入实际的原始数据。我会看看如果我能适应你所说的话,以更好地适应我的工作流程 – 2014-09-19 19:24:19
@PhilBarresi完全有可能自动化创建对象的过程并向他们添加对'then'的承诺 - 事实上Angular会自己做到这一点1.2之前的版本 – 2014-09-19 19:29:37
当它全部沉没后,我意识到这绝对是正确的方式来看待它;角度的方式是用数据处理数据,而不是通过滥用显示来解决问题。有人向我扔了这个优秀的蹦床,给出了另一个很好的示范,说明如何使用你的建议来实现这一点(http://plnkr.co/edit/H11igQf7OXmoQIRUEkLP?p=info)。 – 2014-09-20 11:32:53