2015-01-15 5 views
1

Я новичок в CoffeeScript и попытаюсь написать угловой контроллер. Однако я думаю, что у меня проблема с переменным охватом. Мой код:Невозможно переназначить переменную в CoffeeScript

app.controller 'IndexController', ['$scope', 'Authentication', 'Items', 'Snackbar', ($scope, Authentication, Items, Snackbar) -> 
    activate = -> 
     itemsSuccessFn = (data, status, headers, config) -> 
      vm.items = data.data 
      return 

     itemsErrorFn = (data, status, headers, config) -> 
      Snackbar.error data.error 
      return 

     Items().all().then itemsSuccessFn, itemsErrorFn 
     return 

    vm = this 
    vm.items = [] 
    vm.isAuthenticated = Authentication.isAuthenticated() 
    activate() 
    return 
] 

Проблема с переменными элементов. При запуске itemsSuccessFn в activate переменная заполняется данными, поступающими из службы. Но в основной области переменная снова пуста. Что я делаю не так? Как мне его решить?

Если в коде есть что-то еще, это должно быть сделано лучше, пожалуйста, дайте мне знать, потому что, как я уже говорил, я только начал учиться.

+0

Что вы имеете в виду, когда 'в основной области переменная снова пуста'? Используете ли вы «контроллер как» -синтекс? Пример: 'ng-controller =" IndexController as vm "'? – tasseKATT

ответ

0

Вместо объявления локальной переменной вы можете напрямую ссылаться на $scope.

app.controller 'IndexController', ['$scope', 'Authentication', 'Items', 'Snackbar', ($scope, Authentication, Items, Snackbar) -> 
    activate = -> 
     itemsSuccessFn = (data, status, headers, config) -> 
      $scope.items = data.data 
      return 

     itemsErrorFn = (data, status, headers, config) -> 
      Snackbar.error data.error 
      return 

     Items().all().then itemsSuccessFn, itemsErrorFn 
     return 

    $scope.items = [] 
    $scope.isAuthenticated = Authentication.isAuthenticated() 
    activate() 
    return 
] 

Однако, если вы используете синтаксис controllerAs, то вы должны иметь правильную ссылку на this с помощью жира стрелки. Таким образом, вам не нужна переменная vm.

app.controller 'IndexController', ['$scope', 'Authentication', 'Items', 'Snackbar', ($scope, Authentication, Items, Snackbar) -> 
    activate = => 
     itemsSuccessFn = (data, status, headers, config) => 
      @items = data.data 
      return 

     itemsErrorFn = (data, status, headers, config) -> 
      Snackbar.error data.error 
      return 

     Items().all().then itemsSuccessFn, itemsErrorFn 
     return 

    @items = [] 
    @isAuthenticated = Authentication.isAuthenticated() 
    activate() 
    return 
] 
+0

Хорошо, я это понимаю. Однако даже когда я сделал то, что вы предложили, и попробуйте «console.log @ items» после активации, массив по-прежнему пуст. Это также не рендеринг в шаблоне, дающий ошибку 'TypeError: Can not read property 'length' of undefined' в строке' $ scope. $ WatchCollection (-> $ scope.items) render' в другом 'ItemsController'. Что мне теперь делать? – Marcin

+0

@Marcin вы можете добавить новый код, с которым у вас возникли проблемы с исходным вопросом? Кажется, вы объявляете 'watch' перед созданием' items'. – firstdoit

Смежные вопросы