3

我正在尝试在 Angularjs 中使用指令来检查用户是否是他们自己,以便相应地更改模板。

例如

    <li is-self >
        <a  ng-show="logged_in" ng-href="/users/{{user.public_id}}"> Settings </a>
    </li>    

诚然,这可能不是解决此问题的最佳方法,但是我目前想不出更好的方法。

然而,我遇到的问题是我不能在指令中执行 http 请求,因此我必须将它放在控制器中并将其作为范围函数引用,即

用户控制器

    $scope.isSelf = ->
        $http({method: 'GET', url: '/is_self/' + $routeParams.id}).
        success((data, status, headers, config) ->
            if data
                $scope.logged_in = true
        ).
        error((data, status, headers, config) ->
            console.log(data)
        )

用户模块

    userModule.directive('isSelf', () ->
      link: ($scope) ->
        $scope.isSelf()

然而,这种技术带来了一个问题,因为该指令被跨多个文件和多个控制器使用。我认为最合适的解决方案只是在指令中执行请求,但这不起作用,因为您似乎无法将 $http 传递给它。

我理想的解决方案是结合我喜欢的

userModule.directive('isSelf', () ->
   link: ($scope, $http) ->
      $http({method: 'GET', url: '/is_self/' + "3f8686589ad"}).
          success((data, status, headers, config) ->
              if data
                  $scope.logged_in = true
          ).
          error((data, status, headers, config) ->
              console.log(data)
          )
)

我显然对框架相当陌生,所以任何帮助将不胜感激。

4

1 回答 1

-1

好的,伙计们,我找到了解决方案。这是为那些有同样问题的人准备的。

好吧,经过更多的修补后,我意识到我想我是以错误的方式去做。我改为根据下面的建议使用服务,如果有人遇到同样的问题并且想知道,这是最终代码。

模块

userModule = angular.module('users', ["ngResource"])

userModule.factory('User', ['$resource', '$http', ($resource, $http) ->
    User = $resource "/users/:id", id: "@id",
        update: method: "PUT"
        destroy: method: "DELETE"

    User::isSelf = (id, cb) ->
        $http.get('/is_self/' + id).success (data) ->
            if data
                cb true

    User
])

控制器

StatsShowCtrl = ($scope, $location, $routeParams, User) ->
    User.get id: $routeParams.id, (user) ->
        self.original = user
        $scope.user = new User(self.original)

        $scope.user.isSelf $routeParams.id, (self) ->
            if self
                $scope.logged_in = true

HTML

<li ng-show="logged_in"> <a ng-href="/users/{{user.public_id}}"> Settings </a></li>
于 2013-02-11T16:41:12.273 回答