Просто напишите ng-click перед href .. Он работал для меня
<!DOCTYPE html>
<html>
<head>
<script data-require="angular.js@1.5.0" data-semver="1.5.0" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
<script>
angular.module("module",[])
.controller("controller",function($scope){
$scope.func =function(){
console.log("d");
}
})</script>
</head>
<body ng-app="module" ng-controller="controller">
<h1>Hello ..</h1>
<a ng-click="func()" href="someplace.html">Take me there</a>
</body>
</html>
Давайте пройдемся по коду, не так ли?
#bowling.rb
class Bowling
@game_score = 0 # (1)
На данный момент (1) мы все еще находимся внутри класса Bowling
. Помните: классы - это такие же объекты, как и любые другие. Итак, на этом этапе вы назначаете 0
переменной экземпляра @game_score
объекта класса Bowling
.
def hit(pins)
@game_score = @game_score + pins # (2)
Теперь (2) мы внутри метод экземпляра класса Bowling
. То есть: это метод, который будет принадлежать экземпляру из Bowling
. Итак, теперь переменная экземпляра @game_score
принадлежит экземпляру класса Bowling
, а не самому классу.
Начиная с это переменная экземпляра никогда ничем не инициализируется, она будет оцениваться как nil
(в Ruby, неинициализированные переменные всегда оцениваются как nil
), поэтому это оценивается как @game_score = nil + pins
и поскольку nil
не имеет метода # +
, это приведет к возникновению исключения NoMethodError
.
end
def score
@game_score # (3)
И здесь (3) мы снова находимся внутри метода экземпляра класса Bowling
. Это всегда будет оцениваться как nil
по причине, которую я указал выше: @game_score
никогда не инициализируется, поэтому он оценивается как nil
.
end
end
Мы можем использовать Возможности отражения в Ruby, чтобы взглянуть на то, что происходит:
p Bowling.instance_variable_get(:@game_score) # => 0
b = Bowling.new
p b.instance_variable_get(:@game_score) # => nil
Теперь давайте добавим значение в переменную экземпляра:
b.instance_variable_set(:@game_score, 1)
p b.score # => 1
b.hit(3)
p b.score # => 4
Итак, мы видим, что все работает так, как должно, нам только нужно выяснить, как убедиться, что переменная экземпляра инициализируется.
Для этого нам нужно написать метод инициализатора. Как ни странно, метод инициализатора на самом деле является частным методом экземпляра с именем initialize
. (Причина, по которой initialize
является методом экземпляра, а не методом класса, на самом деле довольно проста. Ruby разделяет создание объекта на две фазы: выделение памяти и инициализация объекта. Выделение памяти выполняется методом класса , называемым alloc
, а инициализация объекта выполняется методом экземпляра с именем initialize
. (Программисты Objective-C это поймут.) Причина, по которой alloc
является методом класса, просто в том, что на данный момент выполнения экземпляра еще нет. И причина того, что initialize
является методом экземпляра, заключается в том, что инициализация объекта, очевидно, выполняется для каждого объекта. Для удобства существует стандартный метод фабричного класса под названием new
, который вызывает для вас как alloc
, так и initialize
.)
class Bowling
def initialize
@game_score = 0
end
end
Давайте проверим это:
c = Bowling.new
p c.score # => 0
c.hit(2)
p c.score # => 2
] Кстати: просто несколько небольших советов по стилю Ruby: отступ составляет 2 пробела, а не 1 табуляция.
Потому что у вас нет
def initialize
@game_score = 0
end
Назначение в определении класса не делает то, что вы думаете, и когда попадание
вызывается, оно не может добавьте к nil
.
Если вы теперь спросите , что случилось с @game_score
? , хорошо, всегда помните Класс - это объект и Object - это класс .
Это здорово, как классы Ruby имеют это «реальное» существование в стиле Дзен. Ruby не имеет точно именованных классов, скорее, имена классов являются ссылками на объекты класса Class
. Назначив @game_score
вне метода экземпляра, вы создали переменную экземпляра класса , атрибут объекта класса Bowling
, который является экземпляром класса Class
. В общем, эти объекты не очень полезны. (См. Главу 1, Путь Рубина , Хэл Фултон.)
@game_score
, определенная там, называется переменной экземпляра класса , которая является переменной, определенной для объекта одноэлементного класса:
class << Bowling
attr_accessor :game_score
end
Bowling.game_score #=> 0
Это, как вы можете сказать, разные из обычных переменных экземпляра , определенных для экземпляров объектов.
@game_score здесь никогда не получит нулевое значение - вам нужно поместить его в initialize, как в
def initialize @game_score = 0 конец