我正在使用angularjs开发应用程序,我也使用指令,因为某些UI在多个页面中重复使用。当我有一个依赖于promise的值的指令时,我必须使用$ scope。$ watch和if条件来检查undefined,因为该指令在promise完成之前编译。这是一个例子:
myAppModule.directive('topicDropdown', function () {
return {
templateUrl: 'Scripts/app/shared/dropdown/tmplTopic.html',
restrict: 'AE',
scope: {
subjectId: '=',
setDefault: '=',
topicId: '='
},
controller: [
'$scope', 'service', function ($scope, service) {
$scope.$watch('subjectId', function () {
if ($scope.subjectId != undefined)
$scope.getTopics();
});
$scope.getTopics = function () {
service.get("section/topics/" + $scope.subjectId).then(function (data) {
$scope.listOfTopics = data;
if ($scope.setDefault) {
$scope.subjectId = $scope.listOfTopics[0].UniqueId;
}
});
}
}
]
}
});
subjectId最终将来自一个承诺,但没有$ watch我会得到一个未定义的错误,因为它将触发没有ID的getTopics。
scope: {
subjectId: '=',
setDefault: '=',
topicId: '='
},
目前,这段代码可以正常工作,但是每当subjectId发生变化时,我都必须调用摘要周期,这会循环播放范围正在观看的所有内容。我只关心此时主题ID的变化。
我也看到了一些建议,使用ng-if作为模板html。像这样:
<div ng-if="subjectId != undefined">
<topic-dropdown subject-id="subjectId"></topic-dropdown>
</div>
有了这个,我不必使用$ scope。$ watch但是我不确定这是否也是最好的方法。
有没有人能很好地解决这个问题?是否有我可以使用的指令属性,我不知道?
尼克
答案 0 :(得分:0)
传递subjectId的承诺并让now
等待它解决。它看起来像这样:
var isFirstWeek = nowMoment.isBefore( weekEnd );
这样做,getTopics
的所有访问都在$scope.getTopics = function () {
$scope.subjectIdPromise.then(function (subjectId) {
$scope.subjectIdPromise = service.get("section/topics/" + subjectId)
.then(function (data) {
$scope.listOfTopics = data;
if ($scope.setDefault) {
return data[0].UniqueId;
} else { return subjectId; }
});
});
};
成功函数中完成。如果您希望更改subjectId
,请使用新的替换承诺。
答案 1 :(得分:0)
尝试使用承诺模式,
$this->output
->set_status_header(200)
->set_content_type('application/json', 'utf-8')
->set_output(json_encode($data))
但我想你会用这种或那种方式使用$ watch。使用$ watch不会伤害任何东西,它保持连接的有条理的方式。