替代使用$ scope。$ watch in directive来处理未定义的变量

时间:2016-03-07 10:48:02

标签: javascript angularjs ajax angularjs-scope watch

我正在使用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但是我不确定这是否也是最好的方法。

有没有人能很好地解决这个问题?是否有我可以使用的指令属性,我不知道?

尼克

2 个答案:

答案 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不会伤害任何东西,它保持连接的有条理的方式。